В дополнение к другим ответам структура может (но обычно не имеет) иметь виртуальные функции, и в этом случае размер структуры также будет содержать пространство для vtbl.
Посмотрите Stevens и также этот долгий поток на activestate, который я нашел лично, чтобы быть и главным образом неправильным и очень к подробному, и я придумал это:
from os import fork, setsid, umask, dup2
from sys import stdin, stdout, stderr
if fork(): exit(0)
umask(0)
setsid()
if fork(): exit(0)
stdout.flush()
stderr.flush()
si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)
dup2(si.fileno(), stdin.fileno())
dup2(so.fileno(), stdout.fileno())
dup2(se.fileno(), stderr.fileno())
Если необходимо остановить тот процесс снова, он требуется, чтобы знать pid, обычным решением этого является pidfiles. Сделайте это при необходимости в том
from os import getpid
outfile = open(pid_file, 'w')
outfile.write('%i' % getpid())
outfile.close()
Из соображений безопасности Вы могли бы рассмотреть любой из них после демонизации
from os import setuid, setgid, chdir
from pwd import getpwnam
from grp import getgrnam
setuid(getpwnam('someuser').pw_uid)
setgid(getgrnam('somegroup').gr_gid)
chdir('/')
Вы могли также использовать nohup, но это не работает хорошо с модулем подпроцесса Python
Используйте grizzled.os.daemonize:
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
Чтобы понять, как это работает или сделать это самостоятельно, считайте обсуждение ActiveState.
Если Вы не заботитесь о фактических обсуждениях (которые имеют тенденцию идти offtopic и не предлагают авторитетный ответ), можно выбрать некоторую библиотеку, которая сделает вкус легче. Я повторно прокомментировал бы взгляд на ll-xist, эта библиотека содержит большой объем спасительного кода, как помощник заданий крона, платформа демона, и (что не является интересным Вам, но является действительно большим), объектно-ориентированный XSL (ll-xist сам).
Я недавно использовал Туркменбаши :
$ easy_install turkmenbashi
import Turkmenbashi
class DebugDaemon (Turkmenbashi.Daemon):
def config(self):
self.debugging = True
def go(self):
self.debug('a debug message')
self.info('an info message')
self.warn('a warning message')
self.error('an error message')
self.critical('a critical message')
if __name__=="__main__":
d = DebugDaemon()
d.config()
d.setenv(30, '/var/run/daemon.pid', '/tmp', None)
d.start(d.go)