为什么 strace/truss 有时会‘修复’卡住的进程?

为什么 strace/truss 有时会‘修复’卡住的进程?

有时,你会遇到一个卡住的进程,它已经卡住了一段时间,当你用 strace/truss 戳它看看发生了什么事情时,它就会神奇地解开并继续运行!所以,仅仅从“观察”这些程序对卡住程序的运行有一些影响……这里发生了什么?strace(我猜是通过 ptrace(2)?)是否发送了信号,导致程序停止阻塞,或者类似情况?

我已经多次看到这种情况了——最近一次是在 Linux RHEL 4 上(以及一个 Perl 脚本,它弄乱了进程并执行了一些网络 IO),但在其他一些情况下也出现过这种情况。不幸的是,我无法重现这种情况,因为它有时会发生……在危机时刻。但我的好奇心依然存在。:-)

任何解释均值得赞赏。

答案1

这可能是内核中的一个错误,也可能是您正在跟踪的程序中的一个错误?

程序可能错误地实现了事件循环,即等待错误的事情,但之后又等待其他事情EINTR

例子:

为了(;;) {
  选择(...);
  如果 (FD_SET (...i...)) {
    读取(...我...);
    write(...j...); // 简单阻塞写入
  }
}

它可以在简单的测试中工作,但如果任何写入块。

暂停/恢复程序将中止阻塞write并导致主循环继续。

相关内容