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

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),让子进程继承这些描述符,并通过这种方式相互传递数据。

【讨论】:

以上是关于使用命名管道在两个进程之间发送字符串的主要内容,如果未能解决你的问题,请参考以下文章

两个进程之间使用的命名管道有啥问题?

进程之间的通信-命名管道通信

管道和命名管道

Linux_Centos进程间通信_管道(匿名管道_命名管道)

使用命名管道向子进程发送参数

命名管道