Solved Kill a process and its children
-
@hbatalha #include <signal.h>
-
@JoeCFD said in Kill a process and its children:
@hbatalha #include <signal.h>
I am still getting
undeclared identifier 'kill'
error after including <signal.h> -
-
@JoeCFD that's for linux, I was asking for MingW equivalent
-
kill() is a posix API. It isn't part of standard C or C++.
-
@hbatalha Sorry. My bad. It is not for Windows. I thought it is standard C code.
You may try kill -9 pid on MingW. -
@JoeCFD what about taskkill that I am currently using?
-
@hbatalha if it works, it should be ok. Ctrl+C is cleaner, I believe.
https://stackoverflow.com/questions/813086/can-i-send-a-ctrl-c-sigint-to-an-application-on-windows
-
@JoeCFD Ok, thanks for your input in this post, I appreciate it.
-
What you want is
QProcess::terminate
, which does the right thing™, and the right thing is to traverse the threads of the process and post theWM_QUIT
message to each one that runs an event loop. If the process doesn't run an event loop, then the program you're trying to run was never (ever) intended to be controlled from the outside and you should open a feature request for its developers. Coincidentally if it doesn't integrate into the windows event queue, then don't run it, or at least don't expect to (semi)magically be able to control it from another process.Don't kill processes, just as you don't (assumedly) go around killing kittens. It's called
kill
for a good reason and it's bad and ugly, and you shan't do it unless you've exhausted every other means, which you haven't. -
@kshegunov said in Kill a process and its children:
What you want is
QProcess::terminate
QProcess::terminate
doesn't do anything when I call it on Windowsand the right thing is to traverse the threads of the process and post the WM_QUIT message to each one that runs an event loop.
How do you propose to do that?
then the program you're trying to run was never (ever) intended to be controlled from the outside and you should open a feature request for its developers.
Could you elaborate?
-
@kshegunov Also QProcess::terminate :
Console applications on Windows that do not run an event loop, or whose event loop does not handle the WM_CLOSE message, can only be terminated by calling kill().
-
@hbatalha said in Kill a process and its children:
QProcess::terminate doesn't do anything when I call it on Windows
In that case don't run such processes at all. Sorry to break it to you, but you're trying to fit a square peg into a round hole and you actually think this is the right thing to do.
Anecdote time (warning metaphor incoming) ...
You go on this much anticipated date ... you like the girl, you want to have a meaningful conversation with her. You try this and that but somehow it doesn't work out. You stand up to leave but instead of saying a polite goodbye and just walking out, like any regular guy, you reach for and take a baseball bat and beat your date senseless ...
... this in a nutshell is what running a process and then killing it is ...
-
@kshegunov said in Kill a process and its children:
In that case don't run such processes at all. Sorry to break it to you, but you're trying to fit a square peg into a round hole and you actually think this is the right thing to do.
But I am running a console application that by the looks of it is a
Console applications on Windows that do not run an event loop, or whose event loop does not handle the WM_CLOSE message, can only be terminated by calling kill().
Source: QProcess::terminate
@kshegunov said in Kill a process and its children:
... this in a nutshell is what running a process and then killing it is ...
But running this program is unavoidable in my app, so what other options do I have on Windows?
-
@hbatalha said in Kill a process and its children:
But running this program is unavoidable in my app, so what other options do I have on Windows?
Use a different program, one that's aware it may be notified from the outside (i.e. one running an event loop), or open a feature request with the developers of the one you'd wanted to use.
-
@kshegunov said in Kill a process and its children:
Use a different program, one that's aware it may be notified from the outside (i.e. one running an event loop), or open a feature request with the developers of the one you'd wanted to use.
Ok thanks for the info, really appreciate it.