Беда с дуп2 - PullRequest
       24

Беда с дуп2

1 голос
/ 04 сентября 2010

После включения ответа Бена Фойгта в код, похоже, он работает

Оригинальный вопрос:

Я пытаюсь использовать dup2 для:

  1. передать вывод "ls -al" в качестве ввода в "grep foo",
  2. чей вывод становится вводом для "grep bar",
  3. который в итоге выводит на стандартный вывод.

Окончательный вывод - (пусто), файл "in" - (пусто), а файл "out" имеет вывод "ls -al".

Есть идеи, что может происходить?

int main()
{
    pid_t pid;
    int i;
    int inFileDes,outFileDes;   
    inFileDes=open("in",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR); 
    outFileDes=open("out",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);  
    for(i=0;i<3;i++)
    {   
        if((pid=fork())==0)
        {
            switch(i)
            {
                case 0:
                dup2(outFileDes,1);
                execl("/bin/ls","ls","-al",0);
                break;
                case 1:
                                                  // originally:
                dup2(outFileDes,0);   // dup2(outFileDes,1);  
                dup2(inFileDes,1);    // dup2(inFileDes,0);

                execl("/bin/grep","grep","foo",0);   //lines having foo
                break;
                case 2:
                dup2(inFileDes,0);
                execl("/bin/grep","grep","bar",0);  //lines having foo & bar
                break;
            }
            exit(-1);  //in error   
        }
        waitpid(pid,NULL,0);
    }
    close(inFileDes);
    close(outFileDes);
    return(0);
}

1 Ответ

1 голос
/ 04 сентября 2010

Ваш open вызов создает пустой файл "in", и ни одна из программ не записывает в него, так что это ожидаемо.Поскольку оба экземпляра grep читаются из пустого файла, их выходные данные также пусты.

Что вам действительно нужно, так это использовать функцию pipe для получения пары дескрипторов,которая написана, чтобы быть одной программой и читать из следующей.Вам нужно будет вызвать его дважды, потому что у вас есть два набора соединений между дочерними процессами.

...