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
将返回-1
,errno
设置为EPIPE
。【参考方案2】:
如果您使用共享内存方法,那就太好了。在这种方法中,父进程将分配一个内存区域,该区域将在所有进程之间共享。使用锁来保护您的资源,即共享内存。您也可以访问此answer,其中详细介绍了背后的概念。还要记住,在共享内存方法中,通信可以是多对多的。但在管道的情况下,它是一对一的。 干杯, K。 Infoginx.com
【讨论】:
以上是关于c - 使用管道在两个子进程之间持续通信的主要内容,如果未能解决你的问题,请参考以下文章