因此,我正在使用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);
}