Heim >Backend-Entwicklung >PHP-Tutorial >Der untergeordnete Prozess von PHP pcntl_fork verwendete ein Semaphor und konnte nicht erfolgreich beendet werden.

Der untergeordnete Prozess von PHP pcntl_fork verwendete ein Semaphor und konnte nicht erfolgreich beendet werden.

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

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.

Antwortinhalt:

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.

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