叉后创建管道

时间:2012-01-20 20:45:10

标签: c fork pipe

这样做可能/正确吗?如果我从“子”进程的fd1 [1]进行写入,那么是否可以从“父”进程的fd2 [0]中读取?

main(){
    pid_t pid;
    pid = fork();
    if(pid <0){
        return -1;
    }
    if(pid == 0){
        int fd1[2];
        int fd2[2];
        pipe(fd1);
        pipe(fd2);
        close fd1[1];
        close fd2[0];
        //writes & reads between the fd1 pipes
        //writes & reads between the fd2 pipes
    }else{
        int fd1[2];
        int fd2[2];
        pipe(fd1);
        pipe(fd2);
        close fd1[1];
        close fd2[0];
        //writes & reads between the fd1 pipes
        //writes & reads between the fd2 pipes
    }
}

2 个答案:

答案 0 :(得分:4)

不,用于进程间通信的管道应该在 fork()之前创建(否则,你没有简单的方法通过它们发送,因为阅读和写作结束应该是由不同的过程使用)。

在进程之间发送文件描述符作为套接字上的带外消息有肮脏的技巧,但我真的忘记了丑陋的细节

答案 1 :(得分:4)

您需要在分叉之前设置管道

int fds[2];

if (pipe(fds))
    perror("pipe");

switch(fork()) {
case -1:
    perror("fork");
    break;
case 0:
    if (close(fds[0])) /* Close read. */
        perror("close");

    /* What you write(2) to fds[1] will end up in the parent in fds[0]. */

    break;
default:
    if (close(fds[1])) /* Close write. */
        perror("close");

    /* The parent can read from fds[0]. */

    break;
}