Subprocess and pipe-fork-exec primitive

Rafael V. rafaelv at spress.com.br
Wed Aug 1 15:20:10 EDT 2007


Hi Martin,

   the operating system I'm using is SUSE Linux 10, kernel 2.6.13.

   You're right, I was missing something. After you told me that it
couldn't be Python preforming wait() on SIGCHLD, I decided to
investigate further.

   My application requires access to a Informix database, and uses
informixdb. The problem seems to be related to that module. I wrote a
small piece of code to test it:

---------------------------------------------------
#!/usr/bin/env python

from os import fork, execl, waitpid
from informixdb import connect

try:
   conf = {}
   conf['dsn'] = 'db at server'
   conf['user'] = 'user'
   conf['password'] = 'password'
   connection = connect(**conf)

except:
   pass

pid = fork()

if pid == 0:
   # Child
   execl("/bin/sh", "/bin/sh", "-c", "true")

# Parent
waitpid(pid, 0)

print pid
---------------------------------------------------

   If you run the code above multiple times, some runs will trigger
exceptions on the waitpid calls. Commenting the call to
informixdb.connect(), no exceptions are triggered. I am concluding that
informixdb, not Python, is handling the signals and reaping the
subprocesses.

   Now Martin, do you think I can use informixdb.py and subprocess.py in
the same application? I was thinking on forking subprocesses from the
main thread and using other threads to access the Informix database,
would that work?

Thanks,
Rafael.

Martin v. Löwis escreveu:
>>   From my experience, this primitive will fail with 'no child processes'
>> at the waitpid call if the forked child dies very quickly - before the
>> parent is scheduled back for execution. This seems to happen because
>> Python has a default SIGCHLD handler that, in this case, will reap the
>> process before the parent has the chance to do it.
> 
> What operating system is your experience from? On a POSIX system,
> this should not happen - i.e. delivery of SIGCHLD should not cause
> to make the child waited-for. Python itself does not perform wait()
> in response to SIGCHLD.
> 
>>   I would like to know if this is correct, or am I missing something here?
> 
> You must be missing something, although I'm uncertain what precisely
> that is.
> 
> Regards,
> Martin






More information about the Python-list mailing list