0

私はこれを持っています:

$ ls -lh file
-rw-r--r-- 1 ankur root 181M Sep 23 20:09 file

$ head -6 file

z
abc
abc
abc
abc
abc

$ cat file | grep -m 1 z
z

質問:

cat最後の行のコマンドラインが SIGPIPE で途中で終了しないのはなぜですか? その猫の183MBのファイルにgrep比べてあっという間に終了するので、これは起こるべきだと思います。cat file読み取りプロセスがなくなるcatと、壊れたパイプに書き込もうとし、SIGPIPE で終了するはずです。

アップデート:

私はこれを書くことになった:readstdin.c

# include <unistd.h>
# include <stdio.h>

int main() {

    ssize_t n ;        
    char a[5];        
    n = read(0, a, 3);
    printf("read %zd bytes\n", n);
    return(0);

}

私はこのように使用します:

$ cat file | ./readstdin
$ yes | ./readstdin

しかし、それでも早死にすることはありませんcatyes書き込みプロセスが終了する前に読み取りプロセスが終了するため、そうなると思います。

4

2 に答える 2

2

pipe(2)の読み取り側がclose(2)である場合、さらにwrite(2)がSIGPIPE signal(7)を取得します。pipe(7)もお読みください。

SIGPIPEパイプ バッファがいっぱいになると、を取得します。

yes | ./readstdinコマンドでは、コマンドyesSIGPIPEシグナルを取得します。yesターミナルで試してみてください。強制終了するまで、出力が無期限に吐き出されます。

コマンドでは、cat file | ./readstdin(特にfileが非常に小さい場合、sysconf(_POSIX_PIPE_BUF)4096 バイトの可能性があるバイトよりも少ない場合)、catコマンドが記述子をclose(2)-ing しSTDOUT_FILENOており、パイプがまだいっぱいではないことが発生する可能性があります。その後cat、何も得られない場合がありますSIGPIPE

于 2013-09-24T05:04:17.680 に答える