사용된 테스트 코드는 다음과 같습니다.
<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 프로세스 상태가 정상(sleep 상태)임을 확인할 수 있습니다.
<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 프로세스 상태가 정상(sleep 상태)임을 확인할 수 있습니다.
<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 명령을 사용하세요.