当前位置: 技术问答>linux和unix
请教个父子进程管道问题
来源: 互联网 发布时间:2016-11-05
本文导语: #include #include #include #include int main() { int data_processed; int file_pipes[2]; const char some_data[] = "123"; char buffer[BUFSIZ + 1]; pid_t fork_result; memset(buffer, '', sizeof(buffer)); if (pipe(file_pip...
#include
#include
#include
#include
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
pid_t fork_result;
memset(buffer, '', sizeof(buffer));
if (pipe(file_pipes) == 0) {
fork_result = fork();
if (fork_result == -1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
// We've made sure the fork worked, so if fork_result equals zero, we're in the child process.
if (fork_result == 0) {
data_processed = read(file_pipes[0], buffer, BUFSIZ);
printf("Read %d bytes: %sn", data_processed, buffer);
exit(EXIT_SUCCESS);
}
// Otherwise, we must be the parent process.
else {
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("Wrote %d bytesn", data_processed);
}
}
exit(EXIT_SUCCESS);
}
fork 只是创建一个和自身一样的子进程吧,它和父进程只共享代码段,数据段是独立的
也就是说两个进程的 int file_pipes[2]; 之间是毫无关系的
那么父进程往自己的 file_pipes[1] 写数据,那么应该只有自己的file_pipes[0]能读到数据吧,
为什么用子进程的file_pipes[0]能读到父进程管道的数据???
|
虽然子进程的数据段是独立的,但他也不是和父进程没有一点关系。
fork要做的事情之一,就是把父进程的所有数据都copy一份给子进程,从这以后子进程才开始独立。
所以,子进程的int file_pipes[2]; 也是从父进程那里复制过来的。
如果fork之后父进程file_pipes[0]=123,那么子进程是看不到的。
但是实际上父子进程都没有这样的修改,所以两者还是一致的。
fork要做的事情之一,就是把父进程的所有数据都copy一份给子进程,从这以后子进程才开始独立。
所以,子进程的int file_pipes[2]; 也是从父进程那里复制过来的。
如果fork之后父进程file_pipes[0]=123,那么子进程是看不到的。
但是实际上父子进程都没有这样的修改,所以两者还是一致的。
|
再来看看这个简单的例子:
n1、n2的输出很容易理解。
另外你很可能会看到text在父子进程各自输出一次,那是因为fork的时候这几个字符还没有输出到显示器,还在父进程的缓冲区里,也被复制到子进程的缓冲区里然后输出了。
int main()
{
int n1=123, n2=456;
printf("text");
if (fork()==0)
printf("child: n1=%d, n2=%dn", n1, n2);
else
{
n2 = 789;
printf("parent: n1=%d, n2=%dn", n1, n2);
}
}
n1、n2的输出很容易理解。
另外你很可能会看到text在父子进程各自输出一次,那是因为fork的时候这几个字符还没有输出到显示器,还在父进程的缓冲区里,也被复制到子进程的缓冲区里然后输出了。
|
管道里面保存的内容不是数据段里面的,它是一个文件,和父子进程共享什么段没关系。
file_pipes[1]这是一个文件描述符fd,它是保存在数据段里面的。
不只是父子进程,任何其他进程,只要有办法得到这个fd,他就可以读取fd对应的文件也就是管道的内容。
file_pipes[1]这是一个文件描述符fd,它是保存在数据段里面的。
不只是父子进程,任何其他进程,只要有办法得到这个fd,他就可以读取fd对应的文件也就是管道的内容。
|
只是因为无名管道的话其它进程没有很直接的方法获得管道的句柄罢了。理论上来说管道独立于进程并不是只有父子关系的进程才可以共享这个管道。 有名管道跟无各管道的区别就是因为有了名字, 其它进程可以很方便取得管道的句柄而已。
|
只有共同祖先的进程之间才能共享这个管道