杀死已停止并恢复的QProcess

Mic*_*hal 9 unix qt signals

我有一个QProcess,必须暂停和恢复.我用

kill(pid_t(process->pid()), SIGSTOP);
Run Code Online (Sandbox Code Playgroud)

kill(pid_t(process->pid()), SIGCONT);
Run Code Online (Sandbox Code Playgroud)

暂停/恢复过程.

但是,一旦完成,即使通过,也无法再终止该过程QProcess:kill().基本上,没有QProcess::waitForFinished()成功,这个过程变成了僵尸.

有人知道这个的原因,有什么解决方案吗?

注意:我尝试了这个问题的答案,但没有用.我在Mac上这样做,但谷歌搜索表明问题也发生在Linux上.

Alf*_*lfe 0

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

不幸的是,这种情况非常罕见,并且包含许多不同的方面,因此通常不会完全经过测试,因此与同一库的其他部分相比,很可能会出现错误。我假设您刚刚在 QT 代码中发现了问题,或者框架不支持这些信号。您有任何文件表明它应该吗?

您现在可以执行的步骤:

  • 在相关库的错误跟踪系统中搜索已提交的错误报告。
  • 创建一个显示问题的mcve 。
  • 如果未提交任何内容,请提交错误报告;-)

但我不认为库的维护者会很快做出反应(如果有的话)。正如我所说,SIGSTOP 和 SIGCONT 通常在更复杂的场景中不受支持。它们的含义太复杂了。