Я прохожу курс по операционным системам, и мне трудно понять, как ввод перенаправляется с помощью dup2, когда у вас есть вилки. Я написал эту маленькую программу, чтобы попытаться понять ее смысл, но мне не удалось передать вывод внука потомку. Я пытаюсь имитировать команду unix: ps -A | туалет -л. Я новичок в Unix, но я считаю, что это должно подсчитывать строки списка запущенных процессов, которые я получаю. Поэтому мой вывод должен быть одним числом.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main( int argc, char *argv[] ) {
char *searchArg = argv[ 1 ];
pid_t pid;
if ( ( pid = fork() ) > 0 ) {
wait( NULL );
cout << "Inside parent" << endl;
}
else if ( pid == 0 ) {
int fd1[ 2 ];
pipe( fd1 );
cout << "Inside child" << endl;
if ( pid = fork() > 0 ) {
dup2( fd1[ 0 ], 0 );
close( fd1[ 0 ] );
execlp( "/bin/wc", "-l", NULL );
}
else if ( pid == 0 ) {
cout << "Inside grand child" << endl;
execlp( "/bin/ps", "-A", NULL );
}
}
return 0;
}
У меня его нет в приведенном выше коде, но вот мое предположение о том, как все должно происходить:
- Нам нужно перенаправить стандартный вывод команды ps -A (все, что обычно выводится на экран, верно?), чтобы команда wc -l могла использовать его для подсчета строк.
- Этот стандартный вывод можно перенаправить с помощью dup2, например dup2( ?, 1 ), что означает перенаправление стандартного вывода на ?. Затем вы закрываете ?.
Вопрос: Куда мне его перенаправить? Я знаю, что это должен быть один из файловых дескрипторов, но куда его следует перенаправить, чтобы wc мог его обработать?
- wc каким-то образом получает стандартный вывод.
Вопрос: Как wc получает вывод? Через параметр execlp? Или операционная система проверяет один из файловых дескрипторов?
- Выполнить wc -l.
Какой из них закрыт и оставлен открытым, чтобы wc мог получать и обрабатывать вывод ps? Я продолжаю думать, что об этом нужно думать в обратном направлении, поскольку ps должен отдавать свой вывод wc... но это не имеет смысла, поскольку дочерний и внук обрабатываются параллельно.