2017-01-26 4 views
2

Basicaly、Cシェルを書いイムを送信する場合にのみ、私のパイプが終わるのはなぜ.. イム:私はSIGINT

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

しかし、私は問題を抱えていますより遅い/長い実行をパイプしようとしています。

実際

、私はパイプに '猫の/ dev/urandomの' の結果をしようとすると、それはbasicly待つ...

> cat /dev/urandom | cat 
> 

しかし、私は停止する(Ctrl + Cで)SIGINTを送信それ、それはSTDOUTになったバッファを出力します。..

when i ctrl + c , cat /dev/urandom

だから、私の質問は次のとおりです。ここで、iは、この問題を解決しようとするを見てすべきですか? MY PIPE実行の

PARTS:

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は殺されるまで実行されます。したがって、第2のcatはあなたが最初のものを制御するまでは決して起動しません。

+0

これは非常に正確で明示的な答えによって簡単に解決できました。再度、感謝します :) – lifeguru42

関連する問題