我当前的程序使用管道和 fork 实现管道“cat/etc/passwd | cut -f1 -d:”。
我想扩展它以实现更长的管道“cat/etc/passwd | cut -f1 -d:| sort”。
有人可以解释一下我应该怎么做吗?我尝试没有成功,但我知道我需要实现另一个 fork 和管道来扩展管道。
当前程序代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if(!fork()) { /*only use child process*/
close(1); /*close normal stdout*/
dup(pfds[1]); /*make stdout same as pfds[1]*/
close(pfds[0]); /*Dont need this (stdin)*/
execlp("/bin/cat","cat", "/etc/passwd", NULL);
}
else{
close(0); /*close normal stdin*/
dup(pfds[0]); /*make stdin same as pfds[0]*/
close(pfds[1]); /*we dont need this (stdout)*/
execlp("/usr/bin/cut","cut", "-f1","-d:", NULL);
}
int pfds2[2];
pipe(pfds2);
if(!fork()){
dup(pfds2[1]);
close(pfds2[0]);
execlp("/usr/bin/sort", "sort", NULL);
}
else{
close(pfds2[1]);
}
return 0;
}
最佳答案
您需要从管道的后端开始,而不是前端。
尝试执行 fork 和 exec。 fork 将是 cut,exec 将是 sort:
fork -- exec -- sort
|
fork -- exec -- cut
|
no fork -- exec -- cat
关于c - 扩展程序以使用三个命令实现流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891751/