2017-01-26 8 views
2

Basicaly, им писать оболочку в C .. Im пытается реализовать функцию трубы, которая почти сделано:Почему моя труба заканчивается только тогда, когда я отправить SIGINT

> ls | cat -e | wc | wc -l 
> 1 

Но у меня есть проблема, когда пытаясь выполнить более медленное/более длительное выполнение.

В самом деле, когда я пытаюсь трубы результата 'кошки/DEV/urandom', то поясню ждет ...

> cat /dev/urandom | cat 
> 

Но, когда я отправить SIGINT (с Ctrl + C), чтобы остановить это, то он печатает на STDOUT приведённых буферов ..

when i ctrl + c , cat /dev/urandom

Так что мой вопрос: где я должен смотреть на то, чтобы попытаться исправить это?

ЧАСТИ трубочку ИСПОЛНЕНИЯ:

int   exec_apipe(t_me *me, t_node *curs, int is_last) 
{ 
    int  pfd[2]; 
    int  pid; 

    if (pipe(pfd) == -1 || !curs) 
     return (0); 
    if (!(curs->pid = fork())) 
    { 
     dup2(me->fd_in, 0); 
     me->fd_in > 0 ? close(me->fd_in) : 0; 
     if (!is_last) 
      dup2(pfd[1], 1); 
     else if (curs->parent->parent && curs->parent->parent->fd_out >= 0) 
      dup2(curs->parent->parent->fd_out, 1); 
     close(pfd[0]); 
     exec_mpipe(me, curs); 
     exit(-1); 
    } 
    else if (curs->pid > 0) 
    { 
     waitpid(curs->pid, &(curs->ret), WUNTRACED); 
     handle_pid(me, curs->ret); 
     close(pfd[1]); 
     me->fd_in = pfd[0]; 
    } 
    return (pid >= 0 ? 1 : -1); 
} 

Я надеюсь, что кто-то поймет, что им говорят, и, возможно, может помочь .. спасибо

+0

Прочтите все ответы на свои вопросы: http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe –

ответ

2

Вы должны начать все программы в вашем трубопроводе прежде чем ждать любых из них для завершения.

Ваша реализация оболочки ожидает завершения каждого элемента конвейера до того, как он запустит следующий. Но /dev/urandom - бесконечный поток; cat /dev/urandom будет работать до тех пор, пока не будет убит. Таким образом, второй cat никогда не запускается до тех пор, пока вы не будете контролировать-C первым.

+0

Это очень легко разрешило ваш очень точный и ясный ответ! Еще раз спасибо :) – lifeguru42