Я учусь на курсе по операционным системам, и мне тяжело, как ввод перенаправляется с 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 для получения и обработки вывода ps? Я продолжаю думать, что об этом нужно думать задом наперед, так как ps должен передавать свой вывод wc ... но это, кажется, не имеет смысла, так как и дочерний, и внучатый обрабатываются параллельно.