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 的原因,因此请查找对sleep,usleeptime_nanosleep.

于 2011-06-11T14:08:22.697 回答