4

長時間実行している PHP プロセスがあり、ループでハングすることがあります。これは strace の出力ですが、意味がわかりません。

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 ...>

上記の呼び出しは無期限にループし続け、プロセスは回復しません。上記の呼び出しはどういう意味ですか?

4

1 に答える 1

2

申し訳ありませんが、私の前の答えは間違っていました。それは無限に待ちます:

// 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

なぜループにシグナルハンドラーをインストールするのかわかりませんが、これは次のphpコードによって引き起こされる動作です。

while (true) {
    sleep(1);
}

PHPでデバッグ以外の目的でsleepを呼び出す理由は想像できないので、、、またはの呼び出しを探しsleepusleepくださいtime_nanosleep

于 2011-06-11T14:08:22.697 に答える