使用的测试代码如下:
<code><?php cli_set_process_title('test-semaphore');$semid = sem_get(ftok(__FILE__, 'x'), 1);function daemonize(){ umask(0); $pid = pcntl_fork(); if (-1 === $pid) { throw new Exception('fork fail'); } elseif ($pid > 0) { // 这里父进程可以退出 exit(0); } if (-1 === posix_setsid()) { throw new Exception("setsid fail"); } // 从这里开始信号量不删除就无法退出 $pid = pcntl_fork(); if (-1 === $pid) { throw new Exception("fork fail"); } elseif (0 !== $pid) { // 子进程退出不成功 exit(0); }}daemonize();// 孙进程退出不成功</code>
在命令行验证:ps aux | grep test-semaphore 可以看到进程状态是正常的(休眠状态)
<code>xxx 115581 0.0 0.2 388532 7760 ? Ss 11:33 0:00 test-semaphorexxx 115582 0.0 0.1 388532 7584 ? S 11:33 0:00 test-semaphore</code>
在代码的任意地方使用sem_remove()或者ipcrm命令都可以让进程退出。
回复内容:
使用的测试代码如下:
<code><?php cli_set_process_title('test-semaphore');$<p style="color:transparent">2本文来源gao!daima.com搞$代!码网</p><span>搞代gaodaima码</span>semid = sem_get(ftok(__FILE__, 'x'), 1);function daemonize(){ umask(0); $pid = pcntl_fork(); if (-1 === $pid) { throw new Exception('fork fail'); } elseif ($pid > 0) { // 这里父进程可以退出 exit(0); } if (-1 === posix_setsid()) { throw new Exception("setsid fail"); } // 从这里开始信号量不删除就无法退出 $pid = pcntl_fork(); if (-1 === $pid) { throw new Exception("fork fail"); } elseif (0 !== $pid) { // 子进程退出不成功 exit(0); }}daemonize();// 孙进程退出不成功</code>
在命令行验证:ps aux | grep test-semaphore 可以看到进程状态是正常的(休眠状态)
<code>xxx 115581 0.0 0.2 388532 7760 ? Ss 11:33 0:00 test-semaphorexxx 115582 0.0 0.1 388532 7584 ? S 11:33 0:00 test-semaphore</code>
在代码的任意地方使用sem_remove()或者ipcrm命令都可以让进程退出。