1

我的管道需要一点帮助。

我正在尝试创建一个以单个进程开始的程序,根据用户定义的数字生成子进程,然后流回另一个(单个)子进程。数据流看起来像这样:

 /-->-█->-\
█-->--█->--█
 \-->-█->-/

我已经完成了流程创建的第一部分。叉子运行良好——我通过一个限制为用户指定数量的循环来运行它。让我失望的是管道。

为简单起见,我将重点放在第一部分(从父母到多个孩子)。所以我在分叉过程之前创建了管道 - 已经给出了很多。然后我关闭子进程的写入端,关闭 stdin,dup 使子进程的 0 重定向到标准输入,然后关闭子进程的 0。那应该照顾子进程的管道,对吧?

所以然后回到父进程,我需要探测通往子进程的管道。无论出于何种原因,这对我来说都是最困难的部分。有人介意带我看看吗?

这是我对这部分代码的了解:

for (i = 0; i < numberOfChildren; ++i) {

    (void) pipe(workFDs[i]);    /* Creates a pipe before the fork */

    if ((workPIDs[i] = fork()) < 0) {
        perror("Error: failure when forking workPID #: \n");
        exit(-1);
    }

    if (workPIDs[i] == 0) {

/* ************************* WORKER PROCESS *********************** */

        close(workFDs[i][1]);   /* Closes the write-end for worker proc */
        close(0);               /* Closes stdin */
        dup(workFDs[i][0]);     /* Redirects workFDs 0 to stdin */
        close(workFDs[i][0]);

        //Fgets to get from the pipe
        //Exec sort stuff here

        }

    } else {

/* *********************** PARENT PROCESS *********************** */

        assert(inputPID == getpid()); /* Just to be sure */

        close(workFDs[i][0]);

        //Fputs to put into the pipe

    }
}
4

0 回答 0