父母和孩子之间可以使用单个管道进行双向通信吗?

时间:2015-04-08 17:03:36

标签: c unix linux-kernel operating-system pipe

假设我在其上使用pipefdn[2]pipe(),可以使用单个管道实现双向通信,还是需要2个管道?

3 个答案:

答案 0 :(得分:0)

不好意思。 Linux pipe()是单向的。请参阅the man page,以及pipe(7)& fifo(7)。另请考虑AF_UNIX套接字,请参阅unix(7)

答案 1 :(得分:0)

如果我错了,请纠正我:但我认为你可以。问题是你可能不想这样做。首先,创建一个简单的程序:

#include <stdio.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int pd[2];
int num = 2;
int main(){
    pid_t t = fork();
    /* create a child process */
    if(t<0){
        printf("error in fork");
        exit(1);
    }
    /* create a pipe */
    if(pipe(pd)==-1){
        printf("error in pipe");
        exit(3);
    }
    else if(t==0){
        //close(pd[1]);  // child close writing end
        int r = read(pd[0], &num, sizeof(num));
        if(r<0){
           printf("error while reading");
           exit(2);
        }
        printf("i am the child and i read %d\n",num);
      //  close(pd[0]);
        exit(0);
    }
    /* parent process */
    //close(pd[0]);   /* parents closes its reading end
    if(write(pd[1],&num,sizeof(num)<0)){
        printf("error in reading");
        exit(4);
    }
    //close(pd[1]);
    /*parent wait for your child to terminate;*/
    int status;
    wait(&status);
    printf("my child ended with status: %d\n",status);
    return 0;
}

尝试使用 close()。通过将其放在评论中或包含它来跳过它。你会发现,为了让这个程序运行,唯一真正需要的系统调用 close 是在孩子阅读之前的系统调用。我在堆栈溢出中找到了一个答案,说“因为写端是打开的,系统等待,因为可能发生潜在的写......”。 就我个人而言,我尝试在没有它的情况下运行它,但我发现它不会终止。 另一个 close() 虽然是一个很好的做法,但不会影响执行。 (我不确定为什么会发生这种情况,也许有经验的人可以帮助我们)。
现在让我们看看你问的是什么:
我可以在这里看到一些问题: 如果两个进程在同一个通道中写入,您可能会遇到竞争条件:
它们同时写入同一个文件描述符:

  • 如果一个进程读取自己的文字而不是进程的文字会怎样 它试图与?您如何知道应该在文件中的哪个位置阅读?
  • 如果一个进程写在另一个进程的“上方”怎么办?

答案 2 :(得分:-2)

是的,可以,我以前做过。我有一个父母和孩子使用相同的2个管道发送彼此不同的消息并正确接收它们。只要确保你总是从第一个文件描述符读取并写入第二个。