验证管道只能用于有亲缘关系的进程通信

    都说管道只能用于具有亲缘关系的进程之间的通信,这里的亲缘关系指的是什么呢?书上是这么说的:有亲缘关系意味着所论及的进程具有某个共同的祖先(我觉得这种说法并不是很可靠,因为所有的进程的祖先进程都是init进程)。我个人是这么理解的,这些亲缘关系的进程是一个进程经过一次或者多次fork出来的进程,管道就是用于这种具有亲缘关系的进程之间的通信。后来查阅了一些网上资料,是这么说的,实践证明,进程的亲缘关系开始于一个登录shell以及由该shell派生出来的所有进程。为了验证这一点,我们来看一个测试例子:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>

  6. int main()
  7. {
  8.     pid_t pid;
  9.     int fd[2];
  10.     char ch;

  11.     pipe(fd);
  12.     pid = fork();
  13.     if(pid == 0) {
  14.         pid = fork();
  15.         if(pid == 0) {
  16.             if(read(fd[0], &ch, 1) != 1) {
  17.                 printf("child read error!\n");
  18.             } else {
  19.                 printf("child\'s child read is:%c\n", ch);
  20.             }
  21.         }
  22.     } else if(pid > 0) {
  23.         close(fd[0]);
  24.         write(fd[1], "f", 1);
  25.     } else {
  26.         perror("fork error");
  27.     }
  28.     return 0;
  29. }
    执行结果:
  1. ^_^[sunny@sunny-laptop ~/summer/pipe]38$ ./a.out
  2. child's child read is:f
  3. ^_^[sunny@sunny-laptop ~/summer/pipe]39$
    程序说明:在父进程当中创建一个进程,然后父进程往管道当中写入一个字符,而子进程继续调用fork创建一个进程,在子进程的子进程当中从管道当中读取这个字符并显示。由此我们可以得出这样的结论:父进程可以与子进程的子进程进行通信。我想书上所说的管道只能用于具有亲缘关系的进程之间的通信就是说的这一点吧。


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(740) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值