Родительский процесс не выполняет команду в канале - PullRequest
0 голосов
/ 06 октября 2018

Итак, я реализую свою собственную оболочку с каналами в 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);
}
...