Heim >Backend-Entwicklung >PHP-Tutorial >Der untergeordnete Prozess von PHP pcntl_fork verwendete ein Semaphor und konnte nicht erfolgreich beendet werden.
Der verwendete Testcode lautet wie folgt:
<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>
Überprüfen Sie in der Befehlszeile: ps aux |. Sie können sehen, dass der Prozessstatus normal ist (Ruhezustand)
<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>
Verwenden Sie den Befehl sem_remove() oder ipcrm an einer beliebigen Stelle im Code, um den Prozess zu beenden.
Der verwendete Testcode lautet wie folgt:
<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>
Überprüfen Sie in der Befehlszeile: ps aux |. Sie können sehen, dass der Prozessstatus normal ist (Ruhezustand)
<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>
Verwenden Sie den Befehl sem_remove() oder ipcrm an einer beliebigen Stelle im Code, um den Prozess zu beenden.