Frage

Ich habe einen langjährigen PHP -Prozess, der manchmal in einer Schleife hängt. Dies ist die Strace -Ausgabe, aber ich weiß nicht, was es bedeutet:

nanosleep({1, 0}, {1, 0})               = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, {1, 0})               = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, {1, 0})               = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0},  <unfinished ...>

Die oben genannten Anrufe werden auf unbestimmte Zeit verkleinert, und der Prozess wird nicht wiederhergestellt. Was bedeuten die obigen Anrufe?

War es hilfreich?

Lösung

Entschuldigung, meine vorherige Antwort war falsch. Es wartet unendlich:

// Ignore SIGCHLD (Child process stopped or terminated)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
// Set handler to SIGCHLD to default (i.e. ignore)
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
// Un-ignore SIGCHLD
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
// Sleep for a second
nanosleep({1, 0}, {1, 0}) = 0

Ich habe keine Ahnung, warum Sie Signalhandler in einer Schleife installieren würden, aber dies ist das Verhalten, das durch den folgenden PHP -Code verursacht wird:

while (true) {
    sleep(1);
}

Ich kann mir keinen Grund vorstellen, warum Sie den Schlaf für nicht entfesseln sleep, usleep oder time_nanosleep.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top