Linux进程通信函数.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进程通信函数

Linux进程通信函数 管道 pipe() 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 管道的经典例子: ls –l|wc –l 常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与命名管道的最大区别。 所需头文件 #includeunistd.h 函数原型 int pipe(int fd[2]) fd[2]:管道的两个文件描述符,调用返回之后就是可以直接操作这两个文件描述符 返回值 成功 0 ,失败 -1 管道的半双工概念 管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。 即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。 如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。 一般文件的I/O函数都可以用于管道,如close、read、write等等。 从管道中读取数据 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0; 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数;如果请求的字节数目不大于PIPE_BUF,返回请求的字节数 PIPE_BUF在include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至少为512字节,red hat 7.2中为4096 管道的简单示例 #include stdio.h #include stdlib.h #include errno.h #include sys/types.h #include unistd.h int main(void) { int pfds[2]; char buf[30]; if (pipe(pfds) == -1) { perror(pipe); exit(EXIT_FAILURE); } if (!fork()) { printf( CHILD: writing to the pipe\n); write(pfds[1], test, 5); printf( CHILD: exiting\n); exit(0); } else { printf(PARENT: reading from pipe\n); read(pfds[0], buf, 5); printf(PARENT: read \%s\\n, buf); wait(NULL); } return 0; } 命名管道FIFO 对于pipe我们不难看出它只能用于一个进程家族之间通信,如果想要让管道在更宽泛的环境中,那是不行的,原因是它没有名字的,另外的进程看不到它,这样就有了命名管道。 命名管道叫FIFO,可以用mkfifo() 在磁盘上创建一个FIFO文件 这就是它与pipe的本质区别,pipe完全就是存在与内存中 当进程想通过该FIFO来通信时就可以标准的open打开该文件,然后开始读写操作。 对于FIFO的读写实现,它与pipe的区别在于:FIFO有open这一操作,而pipe是在调用pipe这个系统调用时直接创建了一对文件描述符用于通信。 并且,FIFO的open操作还有些细致的地方要考虑,例如如果写者先打开,尚无读者,那么肯定是不能通信了,所以就需要先去睡眠等待读者打开该FIFO,反之对读者亦然。 命名管道示例:写端 #include stdio.h #include stdlib.h #include errno.h #include string.h #include fcntl.h #include sys/types.h #include sys/stat.h #include unistd.h #define FIFO_NAME american_maid int main(void) { char s[300]; int num, fd; mknod(FIFO_NAME, S_IFIFO | 0666, 0); printf(waiting for readers...\n); fd = open(FIFO_NAME, O_WRONLY); printf(got a reader--type stuff\n); while (gets(s), !feof(stdin)) { if ((num = write(fd, s, strlen(s))) == -1) perror(write);

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档