Linux进程通信4——使用命名管道.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux进程通信4——使用命名管道

在前一篇文章——Linux进程间通信——使用匿名管道 #include?sys/types.h?? #include?sys/stat.h?? int?mkfifo(const?char?*filename,?mode_t?mode);?? int?mknod(const?char?*filename,?mode_t?mode?|?S_IFIFO,?(dev_t)0);?? 这两个函数都能创建一个FIFO文件,注意是创建一个真实存在于文件系统中的文件,filename指定了文件名,而mode则指定了文件的读写权限。 mknod是比较老的函数,而使用mkfifo函数更加简单和规范,所以建议在可能的情况下,尽量使用mkfifo而不是mknod。 三、访问命名管道 1、打开FIFO文件 与打开其他文件一样,FIFO文件也可以使用open调用来打开。注意,mkfifo函数只是创建一个FIFO文件,要使用命名管道还是将其打开。 但是有两点要注意,1、就是程序不能以O_RDWR模式打开FIFO文件进行读写操作,而其行为也未明确定义,因为如一个管道以读/写方式打开,进程就会读回自己的输出,同时我们通常使用FIFO只是为了单向的数据传递。2、就是传递给open调用的是FIFO的路径名,而不是正常的文件。 打开FIFO文件通常有四种方式, open(const?char?*path,?O_RDONLY);//1?? open(const?char?*path,?O_RDONLY?|?O_NONBLOCK);//2?? open(const?char?*path,?O_WRONLY);//3?? open(const?char?*path,?O_WRONLY?|?O_NONBLOCK);//4?? 在open函数的调用的第二个参数中,你看到一个陌生的选项O_NONBLOCK,选项O_NONBLOCK表示非阻塞,加上这个选项后,表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。 open调用的阻塞是什么一回事呢?很简单,对于以只读方式(O_RDONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_RDONLY),除非有一个进程以写方式打开同一个FIFO,否则它不会返回;如果open调用是非阻塞的的(即第二个参数为O_RDONLY?| O_NONBLOCK),则即使没有其他进程以写方式打开同一个FIFO文件,open调用将成功并立即返回。 对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY?| O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。 四、使用FIFO实现进程间的通信 说了这么多,下面就用一个例子程序来说明一下,两个进程如何通过FIFO实现通信吧。这里有两个源文件,一个fifowrite.c,它在需要时创建管道,然后向管道写入数据,数据由文件Data.txt提供,大小为10M,内容全是字符‘0’。另一个源文件为fiforead.c,它从FIFO中读取数据,并把读到的数据保存到另一个文件DataFormFIFO.txt中。为了让程序更加简洁,忽略了有些函数调用是否成功的检查。 fifowrite.c的源代码如下: #include?unistd.h?? #include?stdlib.h?? #include?fcntl.h?? #include?limits.h?? #include?sys/types.h?? #include?sys/stat.h?? #include?stdio.h?? #include?string.h?? ?? int?main()?? {?? ????const?char?*fifo_name?=?/tmp/my_fifo;?? ????int?pipe_fd?=?-1;?? ????int?data_fd?=?-1;?? ????int?res?=?0;?? ????const?int?open_mode?=?O_WRONLY;?? ????int?bytes_sent?=?0;?? ????char?buffer[PIPE_BUF?+?1];?? ?? ????if(access(fifo_name,?F_OK)?==?-1)?? ????{?? ????????//管道文件不存在?? ????????//创建命名管道?? ????????res?=?mkfifo(fifo_n

文档评论(0)

yuerang3062 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档