2014/12/23(Tue)
UNIX/Linuxのパイプ
20年くらい日々使っていながら、UNIX/Linuxのパイプの振る舞いをよく分かってませんでした。『易経』に「日に用いて知らず」というのはこれです。ちょっと簡単なコードで実験してみました。
リスト1 test1.c
#include <stdio.h> int main(void) { int i; for(i=0;i<5;i++){ sleep(1); printf("test1(%d)\n",i); fflush(stdout); // ←これが大事 } return 0; }
リスト2 test2.c
#include <stdio.h> int main(void) { char buff[1024]; printf("test2 starts.\n"); while(gets(buff)!=NULL){ printf("test2[%s]\n",buff); } return 0; }
実行結果
$ gcc test1.c -o test1 $ gcc test2.c -o test2 $ ./test1 | ./test2 test2 starts. ← 0秒後 test2[test1(0)] ← 1秒後 test2[test1(1)] ← 2秒後 test2[test1(2)] ← 3秒後 test2[test1(3)] ← 4秒後 test2[test1(4)] ← 5秒後 $ ← 5秒で終了
つまり
test1とtest2はパラレルに動いてて、test2のgetsが標準入力(=test1の標準出力)を同期待ちしてるんですね。
トラックバック - http://d.hatena.ne.jp/licheng/20141223/p1
リンク元
- 7 https://www.facebook.com/
- 5 http://l.facebook.com/l.php?u=http://d.hatena.ne.jp/licheng/20141223&h=sAQGEe696AQEcyk56_t65fI7RDKDSUTT--ARNRJcYwObYDA&enc=AZM217rNvQzcB1OYtT664mF9WNY9rEaDx6ylxR1qJT6yQaIYtnWg77KaZtUbr9vsNUqssgDn6odrU-usqEdXpGEdHnYqPxVi-hrV0BDr8AXEqLrXVmZ_WNZZId
- 5 http://t.co/O3qCvxNUN8
- 4 https://www.google.co.jp/
- 3 http://b.hatena.ne.jp/
- 3 http://pipes.yahoo.com/pipes/pipe.info?_id=VPw6npu13RGKo15vBRNMsA
- 2 http://d.hatena.ne.jp/
- 1 http://a.hatena.ne.jp/houmei/simple
- 1 http://b.hatena.ne.jp/entrylist?
- 1 http://b.hatena.ne.jp/entrylist?url=http://himasoku.com/