都说管道只能用于具有亲缘关系的进程之间的通信,这里的亲缘关系指的是什么呢?书上是这么说的:有亲缘关系意味着所论及的进程具有某个共同的祖先(我觉得这种说法并不是很可靠,因为所有的进程的祖先进程都是init进程)。我个人是这么理解的,这些亲缘关系的进程是一个进程经过一次或者多次fork出来的进程,管道就是用于这种具有亲缘关系的进程之间的通信。后来查阅了一些网上资料,是这么说的,实践证明,进程的亲缘关系开始于一个登录shell以及由该shell派生出来的所有进程。为了验证这一点,我们来看一个测试例子:
- #include <stdio.h>
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
-
int main()
-
{
-
pid_t pid;
-
int fd[2];
-
char ch;
-
-
pipe(fd);
-
pid = fork();
-
if(pid == 0) {
-
pid = fork();
-
if(pid == 0) {
-
if(read(fd[0], &ch, 1) != 1) {
-
printf("child read error!\n");
-
} else {
-
printf("child\'s child read is:%c\n", ch);
-
}
-
}
-
} else if(pid > 0) {
-
close(fd[0]);
-
write(fd[1], "f", 1);
-
} else {
-
perror("fork error");
-
}
-
return 0;
-
}
执行结果:
- ^_^[sunny@sunny-laptop ~/summer/pipe]38$ ./a.out
-
child's child read is:f
-
^_^[sunny@sunny-laptop ~/summer/pipe]39$
程序说明:在父进程当中创建一个进程,然后父进程往管道当中写入一个字符,而子进程继续调用fork创建一个进程,在子进程的子进程当中从管道当中读取这个字符并显示。由此我们可以得出这样的结论:父进程可以与子进程的子进程进行通信。我想书上所说的管道只能用于具有亲缘关系的进程之间的通信就是说的这一点吧。
阅读(2921) | 评论(0) | 转发(0) |