Solved Kill a process and its children
-
@hbatalha said in Kill a process and its children:
Yes I can go in the task manager and kill with no problem, that's what I have been doing
You can try @SGaist's attempt to send the parent process a
SIGINT
and hope that might interrupt its child, I don't know how that all works on Windows.To get at the ffmpeg process to kill it: you should be able to use EnumProcesses function (psapi.h) to enumerate all running processes and look at their names, and kill the desired one. I came across https://social.msdn.microsoft.com/Forums/en-US/67331e20-a30b-417d-85e5-f9350fef908d/do-we-need-to-use-enumprocesses-and-enumprocessmodules-when-terminating-the-process-in-c?forum=vcgeneral or https://stackoverflow.com/questions/1916574/how-to-effectively-kill-a-process-in-c-win32 you might want to read through. Or Google
windows enumprocesses kill process
to get going. -
-
You send out ctrl + C to exit cleanly
kill( m_process->processId(), SIGINT ); -
I thank everyone's reply here, I was able to find a solution for windows by, as suggested in the replies, sending SIGNT signal to the parent process.
I found the solution in @JonB referenced SO post in this answer and translated it into Qt code:
QProcess::execute("taskkill", {"/pid", QString::number(process->processId()), "/t", "/f"});
I am yet to test the
QProcess::kill
behavior in Linux. It would be a bonus if someone who knows telling me. -
@hbatalha kill( m_process->processId(), SIGINT ); is same as Ctrl + C.
will work on both Windows and Linux. kill() is c code. You do not need taskkill pid on Windows and kill -9 pid on Linux. -
@JoeCFD in which header will I find the kill function?
-
@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?