Reputation: 1503
I've have a simple means to a daemon via a double fork:
try:
child = os.fork()
if child > 0:
sys.exit(0)
except OSError:
print("fork 1 failed")
sys.exit(1)
try:
child = os.fork()
if child > 0:
sys.exit(0)
except OSError:
print("fork 2 failed")
sys.exit(1)
os.execvp(args[0], args) # what the daemon's supposed to be doing
Or alternatively, this is what I had before, but I suspect that it's not correct:
child = os.fork()
if not child:
secondchild = os.fork()
if not secondchild:
os.execvp(args[0], args)
else:
os._exit(0)
I'd like to get back the process id of the daemon in the grandparent process that it gets disconnected from. Is this possible while still using os.fork() and os.execvp() (as opposed to threads, subprocesses, etc.)?
Upvotes: 5
Views: 937
Reputation: 369044
Using os.pipe
:
import os
import sys
try:
r, w = os.pipe()
print('grandparent {}'.format(os.getpid()))
child = os.fork()
if child > 0:
grandchild_pid = int(os.fdopen(r).readline().strip())
print('grand child pid: {}'.format(grandchild_pid))
sys.exit(0)
except OSError:
print("fork 1 failed")
sys.exit(1)
try:
print('parent {}'.format(os.getpid()))
child = os.fork()
if child > 0:
# Pass child (grandchild)'s pid to parent.
os.write(w, '{}\n'.format(child))
sys.exit(0)
except OSError:
print("fork 2 failed")
sys.exit(1)
print('child {}'.format(os.getpid()))
UPDATE
Replace following line:
os.write(w, '{}\n'.format(child))
with:
os.write(w, '{}\n'.format(child).encode())
to make it work in Python 3.x.
Upvotes: 4