Монтажная труба в C

Я реализую канал на C. Когда я пытаюсь выполнить команду cat aa | grep "something" 'в моей программе. Просто зависший процесс grep, кажется, ждет ввода. Не знаю почему. Вот основной код. Просто возьмите ExecuteCommand как просто вызовите функцию execve, и все аргументы будут переданы правильно.

if ((pid = fork()) < 0)
{
    perror("fork failed\n");
    exit(1);
}               
if (pid)
{   // parent as pipe WRITER
    close(pd[0]);
    close(1);
    // replace input with pipe
    dup(pd[1]);

    // recursively call next commands
    ExecuteCommand(cmds, env);
    FreeCommandsArray(&cmds);

    exit(0);
}
else
{   // child as pipe READER
    close(pd[1]);
    close(0); // close its READ end
    dup(pd[0]);
    ExecuteCommand(*(++splitCmds), env);
    FreeCommandsArray(&cmds);
    exit(0);
}

Открыт полный код. Другая проблема заключается в том, что я должен использовать полный путь к командному файлу в качестве первого параметра для execve (например, / bin / ls для ls), в противном случае я получил сообщение об ошибке, такого файла не существовало.


person Hengstar    schedule 21.09.2015    source источник
comment
Вы уверены, что должны вызвать exit() в родительском процессе? У вас есть еще fork() звонок, который вы не показываете?   -  person Some programmer dude    schedule 21.09.2015
comment
да, если вы перейдете к полному коду, вы должны увидеть, что это уже форк, прежде чем идти сюда   -  person Hengstar    schedule 21.09.2015
comment
Просто возьмите ExecuteCommand как просто вызовите функцию execve, и все аргументы будут переданы правильно. - вам придется это доказать. Уменьшите код, чтобы вы могли опубликовать его здесь в компилируемой версии, демонстрирующей нежелательное поведение. Кстати, я бы назвал это использованием каналов ...   -  person    schedule 21.09.2015


Ответы (1)


Причина проблемы заключается в кавычке в первом аргументе grep. Он хорошо работает, если я избавлюсь от него при вводе. например, кошка аа | grep drw 'вместо' cat aa | grep "что-то" '

person Hengstar    schedule 21.09.2015
comment
хотя вывод правильный, кажется, что процесс grep никогда не прекращает свою работу до того, как умрет основной процесс. - person Hengstar; 21.09.2015