gpt4 book ai didi

C++程序使用管道模拟ls|wc|wc运行成功后不显示输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:36 24 4
gpt4 key购买 nike

程序执行,但没有显示最终输出。我似乎弄乱了输出的管道。

删除了对 execlp()、pipe()、fork() 失败的检查,因为它们不会导致上述问题。

#include "iostream"
#include "stdlib.h"
#include "unistd.h"
#include "wait.h"
#include "stdio.h"
#include "fcntl.h"
using namespace std;
int main(int argc, char **argv)
{
int fd[2],status,status2,fd1[2];
pipe(fd);
pipe(fd1);
char buf[12];
switch(fork())
{
case 0:
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execlp("ls","ls",NULL);
exit(0);
break;
default:
waitpid(-1,&status,0);
close(fd[1]);
close(fd1[0]);
dup2(fd1[1],1);
close(fd1[1]);
dup2(fd[0],0);
close(fd[0]);
execlp("wc","wc",NULL);
}

switch(fork())
{
case 0:
close(fd1[1]);
dup2(fd1[0],0);
close(fd1[0]);
execlp("wc","wc",NULL); //this is not being redirected to STDOUT
exit(0);
break;
default:
waitforpid(-1,&status2,0);
}
return 0;
}

最佳答案

exec 函数族不会生成单独的进程,而是替换当前进程。如 the man page for execlp 中所述, execlp 仅在出现错误时返回控制权。

因此,如果所有 forkexeclp 调用都成功,您的程序将无法到达 execlp 的第三次调用,因为 >第一个 switch 中的 >case 总是被执行,并且它们中的任何一个都会替换你的进程。

与此同时,我建议您不要解析现实生活中的 ls 输出,因为 UNIX 中的文件名可能包含您可能无法解析的空白字符、换行符等,还有其他选项,如 find 命令,可以用 '\0' 分隔文件名。

关于C++程序使用管道模拟ls|wc|wc运行成功后不显示输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43427250/

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