通过管道对接的进程被13号信号所杀
source link: https://www.lujun9972.win/blog/2018/12/09/%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E5%AF%B9%E6%8E%A5%E7%9A%84%E8%BF%9B%E7%A8%8B%E8%A2%AB13%E5%8F%B7%E4%BF%A1%E5%8F%B7%E6%89%80%E6%9D%80/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
通过管道对接的进程被13号信号所杀
当将xargs的内容通过管道传递给其他进程处理时,有时会出现进程被信号13所杀的提示,但是整个命令的返回值为 0
通过 kill -l
我们可以查到信号13是 SIGPIPE
:
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
通过 man signal.h
我们可以查到 SIGPIPE
表示应用 往无人读取的管道写入数据
.
man signal.h |grep SIGPIPE
│SIGPIPE │ T │ Write on a pipe with no one to read it. │
所以,出现该提示的原因是, xargs
逐个地执行 cat
命令,并将内容传递给 head
命令。
head
命令在读取完第一次 cat
的内容并将第一行的内容输出后关闭了管道的读取端,
而 xargs
会继续执行下一个 cat
命令,cat命令的输出写入管道时就会发现管道的读取端已经被管理,从而引发 SIGPIPE
.
而由于整个job的返回值是由管道最后一条命令的返回值决定的,因此返回值为0,但是当你检查 PIPESTATUS[1]
时就会发现有问题了:
find ./ -name "*.org" |xargs -I{} cat "{}" |head -n 1 echo 0:${PIPESTATUS[0]} 1:${PIPESTATUS[1]} 2:${PIPESTATUS[2]}
#+TITLE: AwesomeWM中的client 0:0 1:123 2:0
Recommend
-
43
今天是13号星期五
-
7
进程通信--pipe管道 2018-11-19 02:45:00 Linux函数原型 #include <unistd.h> int pipe(int filedes[2]);filedes[0]用于读出数据,读取时必须关闭写入端,即clo...
-
3
通过命名管道进行异步通信 本文来自依云's Blog,转载请注明。
-
9
原来,神舟13号飞船也已待命 ...
-
6
在AIX上通过数据管道实现进程间通讯-51CTO.COM 在AIX上通过数据管道实现进程间通讯 作者:陈 晔 2011-06-13 09:15:18 在 AIX 应用开发中会遇到进程间通讯的需求,进程间通讯的方法有很多,例如通过共享内存...
-
5
V2EX › Java Java 中通过 Runtime.exec 创建子进程时,父子进程管道通信问题
-
8
驱动通信:通过PIPE管道与内核层通信 在本人前一...
-
5
Python高级(17)—进程间通信之管道◎知识点管道的概述进程间通信之管道◎脚本练习▽ 管道的概述
-
5
如何在Go语言中实现Unix风格的进程管道? 今天看到包云岗老师的一条微博:
-
3
常见的进程间通信IPC机制包括管道(pipe)、信号(signal)、消息队列(message queue)、共享内存(shared memory)和套接字(socket)。1. 管道(Pipe)管道是一种基于内存的、面向字节的、单向的通信方式,通常用于具有亲缘关系的进程间...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK