我有一个QProcess,必须暂停并恢复它。我用
kill(pid_t(process->pid()), SIGSTOP);
和
kill(pid_t(process->pid()), SIGCONT);
暂停/恢复该过程。
但是,一旦完成,该过程将不再终止,即使是QProcess:kill()
也是如此。基本上,没有QProcess::waitForFinished()
会成功,并且该过程会变成僵尸。
有人知道原因吗?有什么解决办法吗?
注意:我尝试了this question的答案,但没有帮助。我在Mac上执行此操作,但是谷歌搜索表明问题也在Linux上发生。
答案 0 :(得分:0)
通常,将SIGSTOP和后续的SIGCONT发送到进程时,可能会发生很多事情。停止进程时,不会同时停止相关进程(例如子进程或父进程)。这可能导致奇怪的异常,例如管道破裂或延迟,从而导致超时。因此,总的来说,这些信号没有得到很好的支持。它们仅适用于非常简单的体系结构(无分支,无子进程等)。另外,由于进程可以对SIGCONT做出反应,因此任何框架(如QT)都可以这样做,并重新初始化其某些功能。当然,这也是有道理的,因为在停止之后,某些事情可能已经改变,而在改变时可能已经注意到了。
不幸的是,这种情况很少见,涵盖了许多不同的方面,因此通常不会完全测试覆盖,因此与同一个库的其他部分相比,存在错误的可能性很大。我假设您只是在QT代码中发现了一个问题,或者该框架只是不支持这些信号。您是否有任何文件指出应该这样做?
您现在可以执行的步骤:
但是,即使有的话,我也不希望库的维护者能够很快做出反应。如我所说,在更复杂的场景中通常不支持SIGSTOP和SIGCONT。它们的含义太复杂了。