例如
uniq < tmp.txt | wc -l
其中 tmp.txt为
0
0
1
1
1
2
0
2
可以使用fork, exec族群, pipe, dup, dup2, open, close的系统调用
不能直接使用execlp执行上述命令
我的想法是利用pipe实现单向管道,父进程使用exec执行uniq < txt,
执行后为
0
1
2
0
2
并将此标准输出用dup2替换为标准输入,进入子进程。子进程执行wc -l之后利用父进程的标准输入得到结果5
自己写的代码如下 但是无法正确输出 望高人解答
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char const *argv[]){
int fd[2];
pid_t pid;
pipe(fd);
if((pid = fork()) == 0){/* child process */
close(fd[1]);
execlp("wc", "wc", "-l", "fd[1]", NULL);
close(fd[0]);
}
else{/* parent process */
close(fd[0]);
dup2(0, 1);
close(0);
fd[1] = open("tmp.txt", O_RDONLY);
execlp("uniq", "uniq", "tmp.txt", NULL);
close(fd[1]);
}
}
https://jingyan.baidu.com/article/5d368d1ef8afd93f60c05708.html