我一直在尝试使用 pipe() 系统调用来创建一个支持管道的 shell(使用任意数量的命令)。
不幸的是,我在使用 pipe() 时运气不佳。在花了几天时间查看各种在线资源之后,我决定编写一个与执行效果相同的过于简化的程序,ls | sort
看看我是否可以让管道为两个兄弟、子进程工作。这是代码:
#include <sys/wait.h>
#include <unistd.h>
void run(char *cmd) {
char *args[2];
args[0] = cmd;
args[1] = NULL;
execvp(cmd, args);
}
int main(void) {
int filedes[2];
pipe(filedes);
pid_t pid_a, pid_b;
if (!(pid_a = fork())) {
dup2(filedes[1], 1);
run("ls");
}
if (!(pid_b = fork())) {
dup2(filedes[0], 0);
run("sort");
}
waitpid(pid_a, NULL, 0);
waitpid(pid_b, NULL, 0);
return 0;
}
管道是在父进程中创建的,我知道在 execvp() 调用之后,每个子进程都会继承 pipe() 在父进程中创建的文件描述符。对于该ls
过程,我使用 dup2() 将其标准输出 (1) 重定向到管道的写入端,对于该sort
过程,标准输入 (0) 被重定向到管道的读取端。
最后,我等待两个进程完成后再退出。
我的直觉告诉我这应该有效,但事实并非如此!
有什么建议么?