我正在构建一个需要与几个子进程进行双向通信的应用程序。我的父母就像一个查询引擎,不断地从标准输入读取单词并将其传递给每个子进程。子进程执行它们的处理并在它们的独占管道上写回父进程。
这在理论上是应该如何工作的,但是我被困在实现细节上。第一个问题是我在分叉孩子之前创建 2 个管道吗?当我分叉时,我知道孩子将继承父母的一组文件描述符,这是否意味着将创建 4 个管道或简单的 2 个管道只是复制。如果它们在孩子中被复制,那么这是否意味着如果我要关闭孩子中的文件描述符,它也会关闭父母的?
我的理论如下,我只需要澄清并走上正轨。这是未经测试的代码,我只是为了让您了解我的想法而编写它。谢谢,任何帮助表示赞赏。
int main(void){
int fd[2][2]; //2 pipes for in/out
//make the pipes
pipe(fd[0]); //WRITING pipe
pipe(fd[1]); //READING pipe
if(fork() == 0){
//child
//close some ends
close(fd[0][1]); //close the WRITING pipe write end
close(fd[1][0]); //close the READING pipe read end
//start the worker which will read from the WRITING pipe
//and write back to the READING pipe
start_worker(fd[0][0], fd[1][1]);
}else{
//parent
//close the reading end of the WRITING pipe
close(fd[0][0]);
//close the writing end of the READING pipe
close(fd[1][1]);
//write data to the child down the WRITING pipe
write(fd[0][1], "hello\n", 6);
//read from the READING pipe
int nbytes;
char word[MAX];
while ((nbytes = read(fd[1][0], word, MAXWORD)) > 0){
printf("Data from child is: %s\n", word);
}
}
}