gpt4 book ai didi

c - 管道实现

转载 作者:IT王子 更新时间:2023-10-29 00:11:22 24 4
gpt4 key购买 nike

我正在尝试实现一个支持管道的 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 是一个按字母顺序排列的无序名称文件.

更新了代码,但仍然不起作用。

谢谢。

最佳答案

您需要用管道的写入端替换一个 child 的标准输出,用读取端替换另一个 child 的标准输入:

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);
}

关于c - 管道实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com