我从“Pipes” section的Beej’s Guide to Unix IPC获取了以下代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
execlp("ls", "ls", NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
execlp("wc", "wc", "-l", NULL);
}
return 0;
}
此代码允许用户查看特定目录中有多少文件。如何编辑此代码以实现更长的管道cat /etc/passwd | cut –f1 –d: | sort
?有没有人知道如何做到这一点,因为我完全卡住了。任何帮助将不胜感激。
答案 0 :(得分:0)
感觉像家庭作业,所以我只是给你一些指示:
较长的管道有两个管道,因此您需要两次调用pipe()。 (我还在检查管道的返回值时。)
有三个过程,即两个叉子。再次,正确检查fork()的返回值:它的三态:父,子或失败,你的程序应该测试所有三种情况。
如果在前面两次调用pipe(),请仔细考虑每个进程中哪些文件描述符(即管道的哪一端),以及在调用execlp()之前要关闭哪些文件描述符。我画了一张照片。
我更喜欢dup2()到dup(),因为你明确地设置了目标文件描述符,所以在调用中指定它是有意义的。也避免了愚蠢的错误。
dup和execlp可能会失败,所以我也要检查它们的返回值......
答案 1 :(得分:0)
您需要(取决于命令列表的长度)一些管道。但是:对于中间的进程,最多只需要两个管道对fds,第一个和最后一个需要一个管道对fds。确实要关闭不需要的管道fds - 否则,子进程可能无法获得EOF而且永远不会完成。
并且(如user3392484所述):检查所有系统调用是否存在错误情况并将其报告给调用者。这将使生活更轻松。
我在最后几天实施了类似的东西,也许你想看一看:pipexec.c。
亲切的问候 - 安德烈亚斯