gpt4 book ai didi

c - 使用命名管道在两个进程之间发送字符串

转载 作者:行者123 更新时间:2023-11-30 16:40:14 26 4
gpt4 key购买 nike

我正在尝试从 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;
}

希望有人能指出我正确的方向。

最佳答案

除非您正在执行非阻塞 IO,否则打开 FIFO 的一端将会阻塞,直到另一端也打开为止。因此,child1 会阻塞其 open(2) 调用,直到 child3 打开管道末端。不过,在 fork child3 之前,您还在父进程中调用 wait(2)

所以你遇到了死锁:Parent 正在等待 child1 fork child3,但 child1 正在等待 child3 code> 打开管道的另一端。

您至少可以通过两种方式解决此问题。首先,只需在 fork 第二个子进程后调用 wait(2) 即可。另一种方法是在父进程中创建一个pipe(2),并让子进程继承这些描述符并以这种方式相互传递数据。

关于c - 使用命名管道在两个进程之间发送字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com