刚开始学习管道(一般的IPC)。在我浏览了一些手册页,网站和一些SO问题之后,例如this,This和其他一些问题。我知道了基本知识,我发现这种沟通只进行了一次,即父母写给孩子和孩子读它或父母和孩子只读一次,然后管子关闭。
我想要的是在没有管道关闭的情况下保持流程之间的通信,即, 比方说,我的程序有2个子进程,其中第一个子进程在while循环中运行某些东西,而第二个进程正在连续运行一个计时器。在一定的时间间隔,我的第二个过程向第一个孩子发送一些“信号”,我的第一个停止并在那一刻打印出一些内容并再次重新启动,以便下一个定时器停止(< -This I done使用了线程)
这是我作为样本尝试的程序。但我无法保持沟通的连续性。
#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);
}
从这些示例中,我推断每次发送/读取后管道都会关闭。 我每次尝试打开新烟斗,但我还是得不到它。
任何人都可以帮助我,我错过了什么,或者我该怎么做?
答案 0 :(得分:2)
现在父母和孩子都创建了自己的一对管道,而另一个管道则不知道。
管道应该在父进程 之前 创建。
此外,关闭循环中管道的读/写端,当你在循环之后关闭它们时,所有的通信都已完成。
一个小小的无关问题......
在读者中你应该循环,而read
不会返回0
(然后管道的写端被关闭)或-1
(如果有错误)。
答案 1 :(得分:0)
如果您使用共享内存方法会很棒。在这种方法中,父进程将分配一个将在所有进程之间共享的内存区域。使用锁来保护您的资源,即共享内存。您还可以访问此answer,其中详细说明了背后的概念。还要记住,在共享内存方法中,通信可以是多对多的。但是在管道的情况下它是一对一的。 干杯, K. Infoginx.com