Я изучаю курс операционных систем, и мне трудно, как ввод перенаправляется с помощью dup2, когда у вас есть вилки . Я написал эту небольшую программу, чтобы попытаться понять ее, но мне не удалось передать результат внучатого ребенка ребенку. Я пытаюсь имитировать команду unix: ps -A | туалет -l. Я новичок в 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;
}
У меня нет этого в приведенном выше коде, но я предполагаю, как все должно пойти вниз:
Вопрос: Куда его перенаправить? Я знаю, что это должен быть один из файловых дескрипторов, но куда его следует перенаправить, чтобы wc мог его обработать?
Вопрос: Как туалет получает вывод? Через параметр execlp? Или операционная система проверяет один из файловых дескрипторов?
Какой из них закрыт и оставлен открытым, чтобы wc мог принимать и обрабатывать вывод ps? Я продолжаю думать, что об этом нужно думать в обратном порядке, так как ps должен передать свой вывод в wc ... но это, похоже, не имеет смысла, поскольку и дочерний, и внучатый ребенок обрабатываются параллельно.