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

时间:2017-04-15 14:30:36

标签: c++ linux bash pipe

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

删除了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;
}

2 个答案:

答案 0 :(得分:1)

似乎第二个fork()不会被执行,因为这两个进程会在execlp指令中变异到程序'ls'和'wc'的代码。 检查是否是这样,也许只需将第一个交换机的默认值中的execlp instruccion更改为第二个交换机即可。

答案 1 :(得分:1)

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

因此,如果所有forkexeclp次调用都成功,则您的程序无法到达execlp的第三次调用,因为第一个case中的一个switch始终执行1}},并且其中任何一个都会替换您的过程。

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