程序执行,但最终输出未显示。我似乎搞砸了输出的管道。
删除了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
仅在发生错误时返回控制。
因此,如果所有fork
和execlp
调用均成功完成,则您的程序将无法达到execlp
的第三次调用,因为始终会执行第一个case
中的switch
之一,并且它们中的任何一个都会替换您的进程。
同时,我建议您不要在现实问题中解析ls
输出,因为UNIX中的文件名可能包含空格字符,换行符等,您可能无法解析,所以还有其他选项,例如find
命令可以分隔文件带有'\0'
的名称。
关于c++ - 成功运行后,使用管道模拟ls | wc | wc的C++程序不显示输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43427250/