c++ system() orphan & zombie processes
I have a little application, let's call it "launch.exe". It is a c++ appl.
What I do in it is I call system() 3 times to launch 3 other applications. let's call these A, B, and C.
problem #1
A, B, and C are GUI apps and "launch.exe" is not able to progress until A exits. Then it is stuck again until B exits. Then stuck again until C exits. I would like lauch.exe to be able to progress while the applications I have opened remain open.Problem #2
Assuming that I am able to figure out a solution to problem #1, after A, B, and C are launched, I don't want "launch.exe" to stay open. I want launch.exe to close and I want A, B, and C to remain running.Here is a scenario for you. Lets us say "launch.exe" only starts one application (let us call it A). Then, after A is started, if i close "launch.e开发者_如何学JAVAxe", A remains open.
OK...this is what I want but what just happened? Is A an orphan now? And if so, is this a problem?
And what if I closed A before I exited launch.exe? On the surface it seems OK, but what does it return to? If I launched an exe in cmd shell, it would return to that, but since I did it from a system() call in a c++ appl, does it return to my lauch.exe or does it become a zombie?
NOTES:
Why am I useing system()? --Cause I need something that is Windows/Linux compatible. --Cause I need to elevate privileges to admin level for some of the applications being launched. --I should add that it is vital that A, B, and C be totally independent (for security reasons they should not share the same memory space or anything else). --Last, some of the apps, B, and C are multi-threaded (I state this because I have read that some functions do not spawn multi-threaded applications properly. I'm not clear on reasons why.).Use spawn
instead, this won't block the launcher until the child exits.
Or, since you're already using Qt, use QProcess
.
There is no portable way to spawn a subprocess as a different user, but the Windows-specific way is CreateProcessWithLogonW
.
Why don't you start your A B C processes with ampersand "&" appended to command parameters
std::system ("ProcessA&");
std::system ("ProcessB&");
std::system ("ProcessC&");
This way your launcher will not wait for these processes to exit.
Then exit your launcher with QApplication::exit
or QApplication::quit
Read this SO question to see the difference between fork/execvp and system().
精彩评论