使用的測試程式碼如下:
<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-semaphore xxx 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'); $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-semaphore xxx 115582 0.0 0.1 388532 7584 ? S 11:33 0:00 test-semaphore </code>
在程式碼的任意地方使用sem_remove()或ipcrm指令都可以讓行程退出。