父进程未在Pipe中执行命令

时间:2018-10-06 18:22:05

标签: c++ pipe fork child-process

因此,我正在使用fork()和pipe()在c ++中用管道实现自己的shell。因此,我当然使用./a.out启动程序,当我启动程序并键入ps -a来查看当前程序时,我得到了这个信息:

  PID TTY           TIME CMD
60730 ttys000    0:00.20 login -pf User
60731 ttys000    0:00.10 -bash
60909 ttys000    0:00.00 ./a.out
60911 ttys000    0:00.01 ps -a

这很有意义,因为我目前是 ./ a.out ,而我只是运行了 ps -a 。现在,我正在尝试以下命令是否有效:ps -a | head -5。但是我得到以下信息:

  PID TTY           TIME CMD
60730 ttys000    0:00.20 login -pf Pape
60731 ttys000    0:00.11 -bash
60978 ttys000    0:00.00 ./a.out
60979 ttys000    0:00.00 ps -a

与运行ps -a时的操作几乎相同,shell自身退出了。但是,在这里查看PID,似乎./a.out被视为子级,ps -a被视为父级。我知道对于这种情况下的管道,ps -a应该是我的孩子,head -5是我的父母,但是head -5甚至都不会执行。

这是我的管道代码。

int fds [2];
pipe (fds); // connect the pipe

if (!fork())
{   cout << getpid() << endl;
    dup2 (fds[1], 1); 
    execlp ("ps", "ps","-a", NULL);
} else
{   
    cout << getpid() << endl;
    wait(0);
    dup2 (fds[0], 0); 
    execlp ("head", "head","-5", NULL);
}

0 个答案:

没有答案