我的管道需要一点帮助。
我正在尝试创建一个以单个进程开始的程序,根据用户定义的数字生成子进程,然后流回另一个(单个)子进程。数据流看起来像这样:
/-->-█->-\
█-->--█->--█
\-->-█->-/
我已经完成了流程创建的第一部分。叉子运行良好——我通过一个限制为用户指定数量的循环来运行它。让我失望的是管道。
为简单起见,我将重点放在第一部分(从父母到多个孩子)。所以我在分叉过程之前创建了管道 - 已经给出了很多。然后我关闭子进程的写入端,关闭 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
}
}