C++ System() orphan & zombie process

c++ system() orphan & zombie processes

本文关键字:zombie process orphan System C++      更新时间:2023-10-16

我有一个小应用程序,我们称之为"launch.exe"。 它是一个 c++ 应用程序。

在其中所做的是我调用 system() 3 次以启动其他 3 个应用程序。 我们称它们为 A、B 和 C。

问题#1
A、B 和 C 是 GUI 应用程序,在 A 退出之前,"launch.exe"无法进行。 然后它再次卡住,直到 B 退出。 然后再次卡住,直到 C 退出。 我希望 lauch.exe能够在我打开的应用程序保持打开状态时继续前进。

问题#2
假设我能够找出问题 #1 的解决方案,在启动 A、B 和 C 之后,我不希望"launch.exe"保持打开状态。 我希望启动.exe关闭,我希望 A、B 和 C 保持运行。

这是适合您的一个场景。 假设"launch.exe"只启动一个应用程序(我们称之为A)。 然后,在 A 启动后,如果我关闭"launch.exe",A 将保持打开状态。

还行。。。这就是我想要的,但刚刚发生了什么? A现在是孤儿吗?如果是这样,这是一个问题吗?

如果我在退出启动之前关闭了 A .exe怎么办? 从表面上看似乎还可以,但它又回到了什么? 如果我在 cmd shell 中启动了一个 exe,它会返回到那个,但由于我是从 c++ 应用程序中的 system() 调用中完成的,它是返回到我的 lauch.exe还是变成僵尸?

笔记:
我为什么要使用 system()?
--因为我需要一些与Windows/Linux兼容的东西。
--因为我需要将某些正在启动的应用程序的权限提升到管理员级别。
--我应该补充一点,A,B和C完全独立是至关重要的(出于安全原因,它们不应该共享相同的内存空间或其他任何东西)。
--最后,一些应用程序,B和C是多线程的(我这样说是因为我读过某些函数不能正确生成多线程应用程序。 我不清楚原因。

请改用spawn,这不会阻止启动器,直到孩子退出。

或者,由于您已经在使用 Qt,请使用 QProcess


没有可移植的方法可以以其他用户的身份生成子进程,但特定于 Windows 的方式是 CreateProcessWithLogonW .

为什么不使用在命令参数后附加 & 符号和 "&" 启动 A B C 进程

std::system ("ProcessA&");
std::system ("ProcessB&");
std::system ("ProcessC&");

这样,您的启动器就不会等待这些进程退出。

然后以QApplication::exitQApplication::quit退出启动器

阅读这个SO问题,看看fork/execvp和system()之间的区别。