Heim  >  Artikel  >  Backend-Entwicklung  >  PHP pcntl_fork出来的子进程用到了信号量退出不成功

PHP pcntl_fork出来的子进程用到了信号量退出不成功

WBOY
WBOYOriginal
2016-08-18 09:16:251465Durchsuche

使用的测试代码如下:

<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命令都可以让进程退出。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn