长时间运行的PHP进程陷入循环 - 包括strace输出

时间:2011-06-11 13:50:41

标签: php c linux strace

我有一个长时间运行的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 ...>

上面的调用会无限循环,并且进程无法恢复。上面的呼叫意味着什么?

1 个答案:

答案 0 :(得分: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,所以请查找sleepusleeptime_nanosleep的任何调用。