Вопрос

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

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

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

  1. Передайте выход «ls -al» в качестве входного в «grep foo»,
  2. чей вывод становится входом для «Греповой панели»,
  3. который, наконец, выводит в Stdout.

Окончательный вывод (пустой), файл «в» IS (Blank) и файл «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);
}
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top