2017-01-26 2 views
2

basicaly, im Schreiben eine Schale in C senden .. Im Versuch, das Rohr Funktion zu implementieren, die fast fertig ist:Warum meine Pfeife endet erst, wenn ich ein SIGINT

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

Aber ich habe ein Problem, wenn versuchen, eine langsamere/längere Ausführung zu pipen.

der Tat, wenn ich mit dem Rohr versuchen, das Ergebnis von 'cat/dev/urandom', es basicly wartet ...

> cat /dev/urandom | cat 
> 

Aber, wenn ich ein SIGINT (mit ctrl + c) senden zu stoppen es, dann druckt er auf STDOUT der resultierende Puffer ..

when i ctrl + c , cat /dev/urandom

Also meine Frage ist: wo soll ich bei suchen, dies zu versuchen, beheben?

Teile meiner PIPE EXECUTION:

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); 
} 

Ich hoffe, jemand wird verstehen, was im Sprichwort, und kann vielleicht helfen .. Dank

+0

Lesen Sie alle Antworten zu: http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe –

Antwort

2

Sie benötigen alle die Programme in der Pipeline zu starten bevor Sie auf warten alle von ihnen zu vervollständigen.

Ihre Shell-Implementierung wartet darauf, dass jedes Pipelineelement beendet wird, bevor es mit dem nächsten beginnt. Aber /dev/urandom ist ein endloser Strom; cat /dev/urandom wird bis zum Tod ausgeführt. Also die zweite cat wird nie gestartet, bis Sie die erste C-Control-C.

+0

Das hat es dank Ihrer sehr präzisen und expliziten Antwort recht einfach gelöst! Danke noch einmal :) – lifeguru42

Verwandte Themen