假设我在其上使用pipefdn[2]
和pipe()
,可以使用单个管道实现双向通信,还是需要2个管道?
答案 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个管道发送彼此不同的消息并正确接收它们。只要确保你总是从第一个文件描述符读取并写入第二个。