我正在尝试实现支持管道的linux shell。我已经完成了简单的命令,在后台运行的命令,重定向,但仍然缺少管道。
我已经阅读过它并看过一些代码片段,但仍然无法找到可行的解决方案。
到目前为止我所拥有的:
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == -1)
return -1;
if (pid == 0)
{
close(fd[1]); //close write to pipe, in child
execlp("cat", "cat", "names.txt", NULL);
}
else
{
close(fd[0]); //close read from pipe, in parent
execlp("sort", "sort", NULL);
}
我是一名新手程序员,你可能会说,当我编写一些我不太了解的东西时,显然就是这种情况,我喜欢从一些非常简单和具体的东西开始然后从那里构建。
因此,在能够在管道中实现三个或更多不同的命令之前,我希望能够计算“ls names.txt | sort”或类似的东西,其中names.txt是一个名称文件无法正常无序的
更新了代码,但仍无效。
感谢。
答案 0 :(得分:11)
你需要将一个孩子的stdout替换为管道的写入端,将另一个孩子的stdin替换为读取端:
if (pid == 0)
{
close(fd[0]); //close read from pipe, in parent
dup2(fd[1], STDOUT_FILENO); // Replace stdout with the write end of the pipe
close(fd[1]); // Don't need another copy of the pipe write end hanging about
execlp("cat", "cat", "names.txt", NULL);
}
else
{
close(fd[1]); //close write to pipe, in child
dup2(fd[0], STDIN_FILENO); // Replace stdin with the read end of the pipe
close(fd[0]); // Don't need another copy of the pipe read end hanging about
execlp("sort", "sort", NULL);
}
答案 1 :(得分:4)