Process C叉和管道闭合端

Process C叉和管道闭合端,process,fork,pipe,Process,Fork,Pipe,我正在构建一个需要与几个子进程进行双向通信的应用程序。我的父进程就像一个查询引擎,不断地从stdin读取单词并将其传递给每个子进程。子进程在其专用管道上执行其处理并写回父进程 这是理论上它应该如何工作,但我被困在实施细节。第一个问题是在分叉子级之前是否创建2个管道?当我使用fork时,我知道子对象将继承父对象的一组文件描述符,这是否意味着将创建4个管道,还是简单地复制2个管道。如果它们在子系统中被复制,那么这是否意味着如果我关闭子系统中的文件描述符,它也会关闭父系统的文件描述符 我的理论如下,我

我正在构建一个需要与几个子进程进行双向通信的应用程序。我的父进程就像一个查询引擎,不断地从stdin读取单词并将其传递给每个子进程。子进程在其专用管道上执行其处理并写回父进程

这是理论上它应该如何工作,但我被困在实施细节。第一个问题是在分叉子级之前是否创建2个管道?当我使用fork时,我知道子对象将继承父对象的一组文件描述符,这是否意味着将创建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);
        }
    }

}
管道本身不会复制到分叉上

单个管道是单向的,有两个描述符-一个用于读取,一个用于写入。因此,在进程A中关闭,例如写描述符,在进程B中关闭读描述符->从B到A的管道

关闭一个进程中的描述符不会影响另一个进程中的描述符。分叉后,每个进程都有自己的描述符空间,它是父进程描述符的副本。以下是手册页的摘录:

子进程应有其自己的父进程文件副本 描述符。每个孩子的文件描述符应参考 与的相应文件描述符相同的打开文件描述 父母


好的,这澄清了一点,你能澄清一下,我关闭了正确的文件描述符在父母和孩子?是的,至少乍一看它看起来是正确的。运行它有什么问题吗?