c - 使用管道在两个子进程之间持续通信

Posted

技术标签:

【中文标题】c - 使用管道在两个子进程之间持续通信【英文标题】:c - continously communicate between two child processes using pipes 【发布时间】:2016-06-29 15:37:40 【问题描述】:

刚开始学习管道(一般是 IPC)。在我浏览了一些手册页、网站和一些诸如 this、This 之类的 SO 问题之后。我了解了基本知识,我发现这种通信只进行了一次,即父母写给孩子,孩子读它,或者父母和孩子互相读写一次,然后管道关闭。

我想要的是在不关闭管道的情况下保持进程之间的这种通信,即 比如说,我的程序有 2 个子进程,其中第一个子进程在 while 循环中运行某些东西,第二个子进程连续运行一个计时器。在一定的时间间隔内,我的第二个进程向第一个孩子发送一些“信号”,我的第一个进程在那个时刻停止并打印一些东西,然后再次重新启动以等待下一次计时器停止。 (

这是我作为示例尝试的程序。但我无法保持通信持续。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)

    int     fd[2], nbytes, count = 5;
    pid_t   childpid;
    char    string[] = "Hello, world!\n";
    char    readbuffer[80];

    if((childpid = fork()) == -1)
    
            perror("fork");
            exit(1);
    

    if(childpid == 0)
    
            /* Child process closes up input side of pipe */


            /* Send "string" through the output side of pipe */
            while(count--)
            
                pipe(fd);
                close(fd[0]);
                write(fd[1], string, (strlen(string)+1));
                close(fd[1]);
            
            exit(0);
    
    else
    
            /* Parent process closes up output side of pipe */
            while(count--)
            
                pipe(fd);
                close(fd[1]);

            /* Read in a string from the pipe */
            nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
            printf("Received string: %s\n", readbuffer);
            close(fd[0]);
            close(fd[1]);
            
    
    int status;
    waitpid(getppid(), &status, 0);

    printf("Done!\n");

    return(0);

从这些示例中,我推断管道在每次发送/读取后都会关闭。 我每次都尝试打开新管道,但仍然无法获得。

谁能帮我看看我错过了什么或者我该怎么办?

【问题讨论】:

尝试使用命名管道。您可以在父级和任意多个子级之间打开不同的命名管道。 【参考方案1】:

现在父子进程都创建了自己的一对管道,其他进程对此一无所知。

管道应该在父进程分叉之前创建。

此外,您关闭管道的读/写端在循环中,当您应该在循环后关闭它们时,当所有通信都完成时。


还有一个不相关的小问题……

在阅读器中,当read 不返回0(然后管道的写端关闭)或-1(如果有错误)时,您应该真正循环。

【讨论】:

是的,但如果我关闭它们,那么我读到 EOF 将不会被接收,因此接收端将不知道输入的终点是什么。对吗? @infoseeker 如果你关闭写端,那么读端将有read 返回0(这意味着“另一端关闭了文件/管道/连接”)。如果您关闭读取端,则写入端将获得SIGPIPE 信号,或者如果您忽略它,则write 将返回-1errno 设置为EPIPE【参考方案2】:

如果您使用共享内存方法,那就太好了。在这种方法中,父进程将分配一个内存区域,该区域将在所有进程之间共享。使用锁来保护您的资源,即共享内存。您也可以访问此answer,其中详细介绍了背后的概念。还要记住,在共享内存方法中,通信可以是多对多的。但在管道的情况下,它是一对一的。 干杯, K。 Infoginx.com

【讨论】:

以上是关于c - 使用管道在两个子进程之间持续通信的主要内容,如果未能解决你的问题,请参考以下文章

两个子进程之间的 Python 管道输出

C - 同时从两个管道(来自两个子进程的父进程)读取?

使用管道在父进程和子进程之间进行通信的问题

C linux中子进程与父进程之间的通信:父进程不阻塞

在 C 中使用管道在父子之间创建双向通信

进程和线程之间的通信