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

时间:2017-10-15 06:08:28

标签: c ipc named-pipes

我正在尝试发送字符串,"嗨"从Child1到Child3,这是两个兄弟进程。代码运行,但是我没有从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 个答案:

答案 0 :(得分:0)

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

所以你有一个死锁:父在等child1分叉child3,但是child1正等待child3打开管道的另一端。< / p>

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