<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/</link>
<title><![CDATA[php的pcntl_signal用法及注意事项]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[linux操作系统]]></category>
<pubDate>Wed, 26 Sep 2012 13:43:50 +0000</pubDate> 
<guid>http://www.snooda.com/read/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;最近需要做一个基于php的多进程server。为了优雅重启，需要捕获一下kill发出的SIGTERM信号，于是用到了pcntl_signal。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;刚开始发现捕获信号无效，无法进入信号处理函数。研究了一下文档，发现要运行一下declare(ticks = 1);看解释说是为了产生时钟云云，我的理解就类似于晶振一样。添加后父进程可以收到信号了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;但是子进程还是无法收到信号，排查了很久，没看到什么异常，子进程是平时阻塞噻socket_accept的，怀疑是不是系统调用在这里无法中断，于是改成while 1循环，可以顺利进入中断处理函数。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;然后搜索了一下，原来pcntl默认都是会自动重新启动被中断的系统调用的，对外表现则是无法中断系统调用的阻塞。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这时回头看手册，原来pcntl_signal还有第三个参数，也是一个可选参数，就是让我们决定是否自动重启系统调用，选择不重启即可。<br/><br/><br/><br/><br/><br/>Tags - <a href="http://www.snooda.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/#blogcomment</link>
<title><![CDATA[[评论] php的pcntl_signal用法及注意事项]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>