1.参考githubgunicornwikisignalWhat-is-SIGCHLD-in-Linux2.Signal2.1POSIX标准信号2.1.1基本介绍SIGCHID:signalchild当子进程终止,被中断或者是中断恢复时,将SIGCHID信号发送给父进程。该信号的常见用法是指示操作系统在子进程终止后清理子进程使用的资源。SIGHUB:signalhangup当控制终端关闭时,SIGHUB信号被发送给父进程,它最初设计用于通知串行线路中断(hangup)的进程。在现代操作系统中,SIGHUB信号通常表示控制伪终端或虚拟终端已经关闭。收到这个信号后,许多守护进程将重新加载它们的配置文件并重新打开它们的日志文件,通常不会在收到信号时退出。NOHUP命令忽略此信号。注意:比如在djangoweb开发环境下,直接使用nohup命令启动服务。关闭终端不会影响web服务器服务SIGQUIT:退出信号由QUIT字符触发(一般用Ctrl-控制),进程在收到SIGQUIT信号时退出,会生成一个core文件,类似a这个意义上的程序错误信号SIGINT:信号中断当用户想中断进程时,控制端按下INTE字符(通常是Ctrl+C)后,控制端会向其他进程发送信号SIGINTSIGTERM:信号终止终端信号被发送到进程以请求其终止。与SIGKILL信号不同,它可以被进程捕获、解释或忽略。这允许进程在适当的情况下执行良好的终止以释放资源和保存状态。SIGINT和SIGTERM几乎是一样的程序结束信号。与SIGKILL不同,这个信号可以被阻塞和处理。通常用于要求程序正常退出。不带参数的shell命令kill会产生这个信号。如果无法终止进程,将尝试SIGKILLSIGKILL:signalkill向进程发送kill信号,使进程立即终止。与SIGTERM和SIGINT相反,这个信号不能被捕获或忽略,接收进程在收到这个信号时不能进行任何清理,但以下情况是例外:(1)僵尸进程不能被杀死,因为它们已经死了,僵尸进程进程正在等待其父进程捕获和处理;(2)处于阻塞状态的进程在被再次唤醒之前不能被杀死;(3)init进程是一个特殊的进程。它不接收不想处理的信号,所以不需要接收kill信号。Linux中的ptracedinit进程是个例外;(4)不间断的休眠进程可能不会终止(释放资源),即使收到SIGKILL,这是为数不多的需要重启操作系统来解决临时软件问题的情况之一。在大多数操作系统的关机过程中,如果SIGTERM不能主动退出,SIGKILL是作为最后手段终止进程的。为了更快的关机,MacOSX10.6(snowleopard,雪豹)向标记为clean的应用程序发送SIGKILL信号,从而加快这些应用程序的关闭过程,估计不会带来什么不良影响。shell命令kill-9对应于SIGKILL信号。该命令可能会产生不良影响,因为该命令不允许进程保存未保存的数据。通常,使用更安全的shell命令(不带参数的kill,即SIGTERM信号)SIGTTIN和SIGTTOU。后台进程,当试图从tty读取或写入时,所有进程都会收到SIGTTIN、SIGTTOU信号,通常,这个信号只被job控制下的进程接收,daemon进程没有控制终端,所以这些将收不到信号。当后台作业要从用户端读取数据时,作业中的所有进程都会收到信号SIGUSR1和SIGUSR2供用户使用,信号根据用户定义的条件发送SIGWINCH:信号窗口改变时控制终端窗口大小变化,SIGWINCH信号发送给进程2.1.2信号汇总终端Ctrl-生成信号SIGQUIT终端Ctrl-C生成信号SIGINTshell命令kill不带参数生成信号SIGTERMshell命令kill-9生成信号SIGKILL2.2管道管道(pipe),管道基本上就是内核中的一块内存,一些进程读写的缓冲区,使用管道的好处是它有两个关联的文件描述符,所以两个进程之间共享数据是就像读写文件一样简单。importosrfd,wfd=os.pipe()#rfd,wfd=(3,4)文件描述符基本上管道所做的是保留一块内存并返回两个文件描述符,可用于从中读取数据和读取数据这个内存块。因此,两个进程进行通信,进程A可以通过wfd写入数据,进程B可以通过rfd读取数据。例如:猫foobar|wc-l这会运行2个进程catfoobar和wc-l,标准输出通常改为管道的写端,wc-l可以把它的标准输入改为管道的读端,用它来读取catfoobar程序输出的数据。这种标准输入、标准输出(STDIN和STDOUT)到管道的变化是由shell进程控制的,STDIN=>cat=>WRITE\_END==READ\_END=>wc=>STDOUT的基本原理和日常管道就像你家里的水管一样,你可以把东西从一个地方转移到另一个地方。还有一点要注意,读会阻塞在空管道上而写会阻塞在满管道上,这是因为读空管道没有数据滴答,写满管道没有内存可写,所以他们等待数据用于读取或等待空闲内存,你可以使用O_NONBLOCK标志来标识管道不会阻塞os.close(w)r=os.fdopen(r)#从管道读取msg=r.read()print"msg=",msgsys.exit(0)else:#Thisisthechildprocess#Closereadend导致孩子不打算从管道中读取os.close(r)w=os.fdopen(w,'w')#写入管道w.write("msgwrittenbychild...")w.close()sys.exit(0)3.源码分析
