LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Файловый деcкриптор забыл закрыть.

Вспомнил, о чем я думал. Его сборщик мусора приберёт. Это же не просто дескриптор, а в GC всё завернуто.

Но когда он его приберёт, хз, так что лучше явно закрыть.

А насчёт остального.

  1. С гарантией убедиться, что данные корректны, мы всё равно не сможем.
  2. Даже если мы как-то убедились в этом, процесс мог сдохнуть сразу после чтения нами PID. И вызывая kill, вовсе не факт, что мы стреляем в нужного.

Ну можно добавить один уровень костылей, хотя смысла особо нет:

function _readPidfile($pidfile) {
    /* XXX: Race conditions are everywhere. But who cares? */

    if (!file_exists($pidfile)) {
        /* No such file - daemon not running */
        return false;
    }

    $f = fopen($pidfile, "r");
    if (!$f) {
        /* Failed to open file - daemon probably not running */
        return false;
    }

    if (flock($f, LOCK_EX | LOCK_NB)) {
        /* Able to acuire lock - daemon not running */
        fclose($f);
        return false;
    }

    /* Return PID */
    $pid = fgets($f);
    fclose($f);
    return $pid;
}

function readPidfile($pidfile) {

    $pid1 = false;
    $pid2 = true;

    while ($pid1 !== $pid2) {
        $pid1 = _readPidfile($pidfile);
        sleep(0.1);
        $pid2 = _readPidfile($pidfile);
    }

    return $pid1;
}

Исходная версия wandrien, :

Файловый деcкриптор забыл закрыть.

Вспомнил, о чем я думал. Его сборщик мусора приберёт. Это же не просто дескриптор, а в GC всё завернуто.

Но когда он его приберёт, хз, так что лучше явно закрыть.

А насчёт остального.

  1. С гарантией убедиться, что данные корректны, мы всё равно не сможем.
  2. Даже если мы как-то убедились в этом, процесс мог сдохнуть сразу после чтения нами PID. И вызывая kill, вовсе не факт, что мы стреляем в нужного.

Ну можно добавить один уровень костылей, хотя смысла особо нет:

function _readPidfile($pidfile) {
    /* XXX: Race conditions are everywhere. But who cares? */

    if (!file_exists($pidfile)) {
        /* No such file - daemon not running */
        return false;
    }

    $f = fopen($pidfile, "r");
    if (!$f) {
        /* Failed to open file - daemon probably not running */
        return false;
    }

    if (flock($f, LOCK_EX | LOCK_NB)) {
        /* Able to acuire lock - daemon not running */
        fclose($f);
        return false;
    }

    /* Return PID */
    $pid = fgets($f);
    fclose($f);
    return $pid;
}

function readPidfile($pidfile) {

    $pid1 = false;
    $pid2 = true;

    while ($pid1 !== $pid2) {
        $pid1 = _readPidfile($pidfile);
        sleep(0.1);
        $pid2 = _readPidfile($pidfile);
    }

    return $pid1;
}