Итак, я реализую свою собственную оболочку с каналами в c ++, используя fork () и pipe ().Поэтому, конечно, я запускаю свою программу, используя ./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
, и оболочка просто выходит из себя.Однако здесь, глядя на 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);
}