程序执行,但最终输出未显示。我似乎搞砸了输出的管道。

删除了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的第三次调用,因为始终会执行第一个case中的switch之一,并且它们中的任何一个都会替换您的进程。

同时,我建议您不要在现实问题中解析ls输出,因为UNIX中的文件名可能包含空格字符,换行符等,您可能无法解析,所以还有其他选项,例如find命令可以分隔文件带有'\0'的名称。

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

10-11 06:25