gpt4 book ai didi

c - 子进程之间的 UNIX 管道

转载 作者:太空狗 更新时间:2023-10-29 17:10:17 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,它将生成任意数量的子进程并在它们之间进行管道传输,类似于命令行管道。在我的例子中,我尝试执行“ls -l | more”并将其输出到标准输出,然后让父级继续执行更多命令。

我有以下代码作为最小示例:

int main (int argc, const char * argv[]) {
int fd[2];
pipe(fd);
chdir("/directory/with/lots/of/files");

// Create one child process for more
int pid = fork();
if (pid == 0) {
close(fd[1]);
int ret = dup2(fd[0],0);
if (ret < 0) perror("dup2");
char *argv[10];
argv[0] = "more"; argv[1] = NULL;
execvp("more", argv);
}
// Create another child process for ls
int pid2 = fork();
if (pid2 == 0) {
int ret = dup2(fd[1],1);
if (ret < 0) perror("dup2");
char *argv[10];
argv[0] = "ls"; argv[1] = "-l";
argv[2] = NULL;
execvp("ls", argv);
}

// wait for the more process to finish
int status;
waitpid(pid, &status, 0);

printf("Done!\n");
return 0;
}

现在,当我执行程序(当然包含在 main() 函数中)时,我最终得到的是更多,这是预期的。我将按“d”向下翻页更多的输出,然后按“u”向上翻页,它似乎工作正常。但是当我到达底部时,它并没有像 more 那样退出,而是留下了一个空白行。 Ctrl-C 可以退出它,但它会退出整个程序,意思是“完成!”行永远不会被打印出来。有电影可用here这说明了发生了什么(请注意,在最后我按 Ctrl-C 返回 bash)。

对此有什么想法吗?我只是想弄清楚如何将它更改为 where 而不是在 more 到达底部后转到空白行,more 退出并返回到父进程以便它可以继续执行。

最佳答案

您至少需要在管道的写入端close(),否则more 永远不会看到EOF。例如:

    ...

// close parent's pipes
close(fd[0]);
close(fd[1]);

// wait for the more process to finish
int status;
waitpid(pid, &status, 0);

printf("Done!\n");
return 0;
}

关于c - 子进程之间的 UNIX 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060350/

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