热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux应用程序之IO编程(一)

我的linux环境是windows8.1+VMware6.5.1+Fedora14,参考书籍:第六章链接:Linux应用程序开发详解(1-11).pdf我利用一个SSH软件SSHS

  我的linux 环境是windows8.1 + VMware6.5.1+  Fedora14,参考书籍:第六章

      链接:Linux应用程序开发详解(1-11).pdf

我利用一个SSH软件SSH Secure File Transfer Client 来从Linux传输文件

技术分享

来张虚拟机运行Fedora的图:

技术分享 

下面步入正题:

IO最基本操作:

 1 //hello.c
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include <string.h>
 8 #include 
 9 #define MAXSIZE
10 int main(void)
11 {
12     int i,fd,size,len;
13     char *buf ="hello! I‘m wirting to this file!";
14     char buf_r[10];
15     len= strlen(buf);
16     if((fd = open("/tmp/hello2.txt",O_CREAT |O_TRUNC | O_RDWR,0666))<0)//打开文件
17     {
18         perror("open:");
19         exit(1);
20     }else 
21     {
22      printf("open file :hello2.txt %d\n",fd);
23     }    
24     if((size =  write( fd, buf,len))<0)//写固定长度数据,buf
25     {
26         perror("write:");
27         exit(1);
28     }else
29     {
30         printf("Wirte %s size=%d\n",buf,size);
31     }
32     lseek(fd,0,SEEK_SET);//文件指针定位到文件头
33     if((size = read(fd,buf_r,10))<0)//读10个字节的数据,这里没有考虑字符串最后一个字节为‘\0‘,要完善
34     {    
35         perror("read:");
36         exit(1);
37     }else
38     {
39         printf("read from file:%s size=%d\n",buf_r,size);
40            } 
41         if( close(fd) <0)//别忘记关闭
42     {
43         perror("Close:");
44         exit(1);
45     }else
46     {
47         printf("Close hello2.txt\n");
48     }
49     exit(0);
50 }

文件的访问涉及到进程间同步、互斥问题,采用Linux的fcntl()函数来加锁。

 1 //function lock_set 
 2 void lock_set(int fd,int type)
 3 {
 4     struct flock lock;
 5     lock.l_whence = SEEK_SET;
 6     lock.l_start = 0;
 7     lock.l_len = 0;
 8     while(1)
 9     {
10         lock.l_type = type;
11         if(fcntl(fd, F_SETLK,&lock) == 0) //如果要操作的文件已经加"写入锁"则fcntl() 返回非0值
12         {
13             if(lock.l_type == F_RDLCK)
14                 printf("read lock set by %d\n",getpid());
15             else if (lock.l_type == F_WRLCK)
16                 printf("write lock set by %d\n",getpid());
17             else if (lock.l_type == F_UNLCK)
18                 printf("release lock by %d\n",getpid());
19             return ;
20         }
21         fcntl(fd, F_GETLK,&lock);//上锁失败说明文件被锁住,则用"F_GETLK"来获取该锁的类型,包括上锁线程ID
22         if(lock.l_type != F_UNLCK)
23         {
24             if(lock.l_type == F_RDLCK)
25                 printf("read lock already set by %d\n",
26                     lock.l_pid);
27             else if(lock.l_type == F_WRLCK)
28                 printf("write lock already set by %d\n",
29                     lock.l_pid);
30              getchar();
31         }
32     }
33 }

下面演示A进程给文件上"写入锁",然后B进程给文件上"读锁"的实验现象:
Souce Code  of A :

 1 //hello3.c 即A 进程
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 //function lock_set 
 9 //...
10 int main(void)
11 {
12     int fd;
13     fd=open("/tmp/hello3.txt",O_RDWR | O_CREAT,0666);
14     if(fd <0)
15     {
16         perror("open");
17         exit(1);
18     }
19     //lock "write"
20     lock_set(fd, F_WRLCK);//给"hello3.txt"文件上"写入锁"
21     getchar();//等待,(按回车继续执行程序)
22     //then unlock
23     lock_set(fd,F_UNLCK);//去锁
24     getchar(); 
25     close(fd);
26     exit(0);
27 }

Souce Code  of B:

 1 //hello4.c   即B进程
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 //function lock_set 
 9 //...
10 int main(void)
11 {
12     int fd;
13     fd=open("/tmp/hello3.txt",O_RDWR | O_CREAT,0666);
14     if(fd <0)
15     {
16         perror("open");
17         exit(1);
18     }
19     //lock "read"
20     lock_set(fd,F_RDLCK);//给我文件hello3.txt上"读锁"
21     getchar();
22     //then unlock
23     lock_set(fd,F_UNLCK);
24     getchar(); 
25     close(fd);
26     exit(0);
27 }

运行效果,

 Step1:运行A进程(./hello3):

技术分享

Step2:打开另一终端,运行B进程(./hello4):

技术分享

Step3:A进程对应终端中按下回车键:

技术分享

Step4:B进程终端中按下回车键:

技术分享

OK,读写锁实验结束。

下面再了解下IO多路复用(用select),这个对我来说有点难理解,贴上代码和效果图,以后斟酌。

 1 //select.c
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 int main(void)
 8 {
 9     int fds[2];
10     char buf[7];
11     int i,rc,maxfd;
12     fd_set inset1,inset2;
13     struct timeval tv;
14     if((fds[0] = open("/tmp/hello5.txt",O_RDWR | O_CREAT,0666))<0)
15         perror("open hello5");
16     if((fds[1] = open("/tmp/hello50.txt",O_RDWR | O_CREAT,0666))<0)
17         perror("open hello50");
18     if((rc = write(fds[0],"hello!\n",7)))
19         printf("rc=%d\n",rc);
20     lseek(fds[0],0,SEEK_SET);
21     maxfd = fds[0]>fds[1] ? fds[0] : fds[1];
22     FD_ZERO(&inset1);
23     FD_SET(fds[0],&inset1);
24     FD_ZERO(&inset2);
25     FD_SET(fds[1],&inset2);
26     tv.tv_sec=2;
27     tv.tv_usec=0;
28     while(FD_ISSET(fds[0],&inset1) || FD_ISSET(fds[1],&inset2))
29     {
30         if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
31             perror("select");
32         else
33          {
34             if(FD_ISSET(fds[0],&inset1))
35             {
36                 rc = read(fds[0],buf,7);
37                 if(rc>0)
38                 {
39                  buf[rc]=\0;
40                  printf("read %s\n",buf);
41                 }else
42                  perror("read");
43             }
44             if(FD_ISSET(fds[1],&inset2))
45             {
46                 rc = write(fds[1],buf,7);
47                 if(rc>0)
48                 {
49                  buf[rc]=\0;
50                  printf("rc=%d,write:%s\n",rc,buf);
51                 }else
52                     perror("write");
53                 sleep(10);
54             }
55          }
56     }
57     exit(0);
58 }

效果图:

技术分享

感谢您的阅读,boyang987 。转载请注明出处。

Linux 应用程序 之 IO编程(一)


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
author-avatar
腾龙娱乐开户
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有