On Fri, Feb 4, 2011 at 5:00 PM, Thiago Macieira <thi...@kde.org> wrote: > On Friday, 4 de February de 2011 16:35:32 Dawit A wrote: >> Let us take out terminate from the equation. It is my mistake I >> included it here because its documentation states that "The process >> may not exit as a result of calling this function". However, I really >> do not understand why what you stated matters for the kill() and timed >> out scenarios... >> >> QProcess process; >> process.start(...); >> >> If the next command I issue is >> >> process.waitForFinished(); >> >> I expect it to wait 30 secs since that is what the default value for >> the timeout parameter states. There is no way I would expect it to >> block for another 30 sec when the variable goes out of scope because >> of its own internal implementation issues. It is doing waitForFinished >> on a child process it created itself. Nothing to do with the API >> caller. > > Ok, that sounds like unexpected behaviour. Has this been filed as a bug?
Not yet. I simply mentioned it here because you seem to be addressing the issue that exposed this behavior, but I guess I can open a ticket against Qt for this. >> The case of the kill is even more baffling to me because its >> documentation clearly says "Kills the current process, causing it to >> exit immediately". So If I kill is invoked as such >> >> process.kill(); >> >> what should a reasonable expectation be ? To me the process gets >> killed immediately. Done, poof, gone. Instead that too blocks for the >> default amount of period if there are internally forked processes that >> are still running when the dtor is encountered yet again. > > A killed process is still not reaped. Subprocesses need to be reaped by their > parents to be cleaned up. There is more information that you can extract from > a process after death, like CPU time consumed. So the implementation will have > to clean up after the child process anyway. > > Is the problem that you're encountering that kill() doesn't kill the > grandchildren processes? > > But I also don't see why a killed process would cause waitForFinished() to > take more than some microseconds to complete. Do you have a testcase? Yep, I do. It is the same thing I cobbled together to replicate the VLC hang bug and posted a while back. I can dust that up and create bug reports against Qt if you like. Should I open two separate tickets for each one of these issue eventhough the cause is the same, i.e. ~QProcess always calling waitForFinished() so long as "d->processState != NoRunning" ? 1113 QProcess::~QProcess() 1114 { 1115 Q_D(QProcess); 1116 if (d->processState != NotRunning) { 1117 qWarning("QProcess: Destroyed while process is still running."); 1118 kill(); 1119 waitForFinished(); 1120 } 1121 #ifdef Q_OS_UNIX 1122 // make sure the process manager removes this entry 1123 d->findExitCode(); 1124 #endif 1125 d->cleanup(); 1126 } Please note that were it not for VLC blocking of the SIGCHLD signal, I doubt I would have noticed this issue because the condition under which waitForFinished is called in QProcess' dtor above would probably never be met ??