gpt4 book ai didi

c - 管道上的持久 execvp?

转载 作者:太空狗 更新时间:2023-10-29 15:55:52 27 4
gpt4 key购买 nike

我正在为我的操作系统类(Posix 和 C)做作业,构建一个 mini-shell,但我不知道如何解决以下问题:

我的 mini-shell 必须接受两个命令,例如 ls | grep 一个。为此,我创建了一个尺寸为 2 的管道和一个子管道。 child 关闭它必须关闭的所有东西并打开它必须打开的所有东西(标准/管道的进出)。然后它使用 execvp 执行“ls”。我相信这很好用。之后,父关闭并打开输入和输出(我确定我做得很好),然后执行 grep a

现在,问题是进程 grep a 永远不会完成。与 tail -1 相同,例如。但它确实适用于 head -1。我认为发生这种情况是因为由父级执行的 greptail 等待更多输入,即使子级已完成其操作。 ls | grep a 产生正确的输出,显示在控制台上(管道的输出设置为默认输出),但是,正如我所说,grep a 没有完成。

所以,我的问题是:如何通知父级管道已完成写入,以便它可以完成例如 grep a 的执行?

谢谢。

代码如下:

[fd 是管道,之前在代码中初始化过。如果您发现任何不协调的地方,请告诉我;我已经稍微清理了代码,这只是有问题的部分,如您所见。]

   int fd[2];
pipe(fd);

if ((pid = fork()) != -1){
if(pid == 0){ /*Child executing */
close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
execvp(argvv[0][0], argvv[0]); /* Here's stored the first instruction */

} else{ /* Parent executing */
wait(&status);
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);
execvp(argvv[1][0], argvv[1]); /* Here's stored the second instruction */
}
}

最佳答案

如果grepls 之后继续运行已经退出,这表明您没有关闭所有需要关闭的管道。

特别是管道的写入端,其读取端附加到 grep进程仍在另一个进程中打开。您需要出示您的代码才能了解更多信息。


您粘贴的代码可以正常工作(当扩展为完整程序时,如下所示)。两个子进程都正常退出。

这意味着您在此处创建简化版本时已经消除了有问题的代码 - 也许您还有另一个 fork()pipe() 之间调用这个fork()

#include <unistd.h>
#include <sys/wait.h>

int main()
{
pid_t pid;
char *argvv[2][3] = { { "ls", 0, 0}, { "grep", "a", 0 } };
int status;

int fd[2];
pipe(fd);

if ((pid = fork()) != -1) {
if(pid == 0){ /*Child executing */
close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
execvp(argvv[0][0], argvv[0]); /* Here's stored the first instruction */

} else{ /* Parent executing */
wait(&status);
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);
execvp(argvv[1][0], argvv[1]); /* Here's stored the second instruction */
}
}

return 0;
}

关于c - 管道上的持久 execvp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129398/

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