使用命名管道在两个进程之间发送字符串
Posted
技术标签:
【中文标题】使用命名管道在两个进程之间发送字符串【英文标题】:Sending a string between two processes using named pipes 【发布时间】:2017-10-15 06:08:28 【问题描述】:我正在尝试从 Child1 向 Child3 发送一个字符串“Hi”,这是两个兄弟进程。代码运行,但是我没有收到 Child3 中 Child1 的输入。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#define MSGSIZE 1024
int main (int argc, char *argv[])
int fd;
char * myfifo = "/desktop/myfifo";
char l[MSGSIZE];
pid_t child1, child3;
mkfifo(myfifo, 0666);
child1 = fork();
if (child1 == 0)
printf("I am Child 1: %d \n", (int)getpid());
fd = open(myfifo, O_WRONLY);
write(fd, "Hi", MSGSIZE);
close(fd);
else
if (child1 > 0 )
printf("I am parent: %d \n", (int)getpid());
wait(0);
child3 = fork();
if (child3 == 0)
printf("I am Child 3: %d \n", (int)getpid());
fd = open(myfifo, O_RDONLY);
read(fd, l, MSGSIZE);
printf("Received: %s \n", l);
close(fd);
wait(0);
unlink(myfifo);
return 0;
希望有人能指出正确的方向。
【问题讨论】:
您认为验证您的管道是否已正确创建不是一个好主意吗?始终检查您的系统调用!错误不容忽视。 【参考方案1】:除非您正在执行非阻塞 IO,否则打开 FIFO 的一端将阻塞,直到另一端也打开。所以child1
阻塞在它的open(2)
调用中,直到child3
打开它们的管道末端。但是,您还可以在父进程中调用 wait(2)
,然后再分叉 child3
。
所以你遇到了一个死锁:Parent 正在等待 child1
分叉 child3
,但 child1
正在等待 child3
打开管道的另一端。
您至少可以通过两种方式解决此问题。首先,只需在 fork 第二个子进程之后调用 wait(2)
即可。另一种方式是在父进程中创建一个pipe(2)
,让子进程继承这些描述符,并通过这种方式相互传递数据。
【讨论】:
以上是关于使用命名管道在两个进程之间发送字符串的主要内容,如果未能解决你的问题,请参考以下文章