[Interest] QProcess overload slot connection
Thiago Macieira
thiago.macieira at intel.com
Thu Mar 14 18:28:20 CET 2019
On Thursday, 14 March 2019 09:59:33 PDT Jason H wrote:
> At a minimum the docs should elaborate that finished() only happens after
> started, and started only happens if the... process is scheduled?
Not exactly. The problem is the asynchronous nature of fork()+exec() on Unix
systems. On Windows, due to CreateProcess(), the process either fails to start
synchronously (start() returns false) or it has started[*].
But on Unix, because we must fork(), the parent process returns control to the
caller before the child process has found out if there's anything to be
exec()d in the first place. At this point, we already know the full path to
the file we want run, but there's no guarantee that exec() will work on it.
That's why we may have start() returning true, but the process still failing
to start on Unix. start() returns true if fork() succeeded, but it doesn't
know if exec() will.
I previously said on this thread that waitForStarted() is acceptable, since it
finishes rather quickly. But what may be acceptable for your code may not for
someone else and introducing that wait period was not deemed acceptable for
QProcess: the child process usually doesn't get scheduled until much later, so
suspending the parent process could introduce unacceptable delays.
[*] does not include process crashing before doing anything useful. By crash,
I also include failing to load the image due to corrupt executables, missing
DLLs, etc.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel System Software Products
More information about the Interest
mailing list