杀死已停止并恢复的QProcess

时间:2018-08-07 12:37:26

标签: qt unix signals

我有一个QProcess,必须暂停并恢复它。我用

kill(pid_t(process->pid()), SIGSTOP);

kill(pid_t(process->pid()), SIGCONT);

暂停/恢复该过程。

但是,一旦完成,该过程将不再终止,即使是QProcess:kill()也是如此。基本上,没有QProcess::waitForFinished()会成功,并且该过程会变成僵尸。

有人知道原因吗?有什么解决办法吗?

注意:我尝试了this question的答案,但没有帮助。我在Mac上执行此操作,但是谷歌搜索表明问题也在Linux上发生。

1 个答案:

答案 0 :(得分:0)

通常,将SIGSTOP和后续的SIGCONT发送到进程时,可能会发生很多事情。停止进程时,不会同时停止相关进程(例如子进程或父进程)。这可能导致奇怪的异常,例如管道破裂或延迟,从而导致超时。因此,总的来说,这些信号没有得到很好的支持。它们仅适用于非常简单的体系结构(无分支,无子进程等)。另外,由于进程可以对SIGCONT做出反应,因此任何框架(如QT)都可以这样做,并重新初始化其某些功能。当然,这也是有道理的,因为在停止之后,某些事情可能已经改变,而在改变时可能已经注意到了。

不幸的是,这种情况很少见,涵盖了许多不同的方面,因此通常不会完全测试覆盖,因此与同一个库的其他部分相比,存在错误的可能性很大。我假设您只是在QT代码中发现了一个问题,或者该框架只是不支持这些信号。您是否有任何文件指出应该这样做?

您现在可以执行的步骤:

  • 在相关库的错误跟踪系统中搜索已提交的错误报告。
  • 创建一个显示问题的mcve
  • 如果什么都没归档,请提交错误报告;-)

但是,即使有的话,我也不希望库的维护者能够很快做出反应。如我所说,在更复杂的场景中通常不支持SIGSTOP和SIGCONT。它们的含义太复杂了。