[Interest] QProcess::execute never returning (5.4/5.5 behaviour change)

Alejandro Exojo suy at badopi.org
Sun Jul 26 19:11:55 CEST 2015


I have one application on Mac with one line like the following:

result = QProcess::execute("/sbin/umount", QStringList() << m_mountedPath);

That stopped working one day, and I could not figure out why. The process is 
executed and runs successfully (I can see it unmounts), but it never returns 
to the caller.

I thought it was something I changed elsewhere, but no. After recompiling with 
5.5.0 (upgrading from 5.4.2) it worked again... partially (explained below). I 
think now that it stopped working when I upgraded to 5.4.2 from 5.4.1.

This works perfectly fine in a test case that just calls execute(), so I think 
the issue is that I'm using the FUSE library. That library calls fork and 
exec, and at some point sets up SIGCHLD in a way that probably prevents 
QProcess from working well (it uses signal instead of sigaction), even if I 
use it in a different thread.

That's the part that works partially as wanted with 5.5.0. I call fuse_mount 
(which is the one I suspect it breaks something) at application startup, and 
the first call to QProces::execute() works. If I call fuse_mount again, the 
second call to execute() works, but never returns to the caller.

So, is this a QProcess limitation or a bug? I see the behaviour change across 
versions. Might be that the other library is doing something plain 
unnacceptable for QProcess? I tried replacing QProces::execute() with 
::system() and it works as expected, though.

Thank you.

PD: And thank you Thiago for your blog posts about forkfd. Reading that 
probably was the key that made me figure out what might be wrong with my app. 
Otherwise I would still be hitting my head against the desk. :)

Alex (a.k.a. suy) | GPG ID 0x0B8B0BC2
http://barnacity.net/ | http://disperso.net

More information about the Interest mailing list