Как вы используете dup2 и fork вместе?

Я изучаю курс операционных систем, и мне трудно, как ввод перенаправляется с помощью 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;
}

У меня нет этого в приведенном выше коде, но я предполагаю, как все должно пойти вниз:

  • Нам нужно перенаправить стандартный вывод команды ps -A (все, что обычно выводится на экран, исправьте ?), чтобы команда wc -l могла использовать его для подсчета строк.
  • Этот стандартный вывод можно перенаправить с помощью dup2, например dup2 (?, 1), что означает перенаправление стандартного вывода на?. Тогда вы закроете?

Вопрос: Куда его перенаправить? Я знаю, что это должен быть один из файловых дескрипторов, но куда его следует перенаправить, чтобы wc мог его обработать?

  • wc каким-то образом получает стандартный вывод.

Вопрос: Как туалет получает вывод? Через параметр execlp? Или операционная система проверяет один из файловых дескрипторов?

  • Выполните wc -l.

Какой из них закрыт и оставлен открытым, чтобы wc мог принимать и обрабатывать вывод ps? Я продолжаю думать, что об этом нужно думать в обратном порядке, так как ps должен передать свой вывод в wc ... но это, похоже, не имеет смысла, поскольку и дочерний, и внучатый ребенок обрабатываются параллельно.

pipe dream

6
задан ShrimpCrackers 14 January 2012 в 07:46
поделиться