建自己的程序放到后台执行?

seai 2013-01-18 11:18:36
找到一段实现代码,不过看的不太明白,请大牛解释一下下面代码是怎样建进程放入后台执行的?

def daemonize(self, stdin = '/dev/null', stdout = '/dev/null', stderr = '/dev/null'):
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
sys.exit(4)

os.chdir('/')
os.umask(0)
os.setsid()

try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
sys.exit(4)

for f in sys.stdout, sys.stderr: f.flush()
si = file(stdin, 'r')
so = file(stdout, 'a+')
se = file(stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
...全文
104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-01-22
  • 打赏
  • 举报
回复
这个我就说不上了,区别是中间实施了setid()……
seai 2013-01-22
  • 打赏
  • 举报
回复
引用 3 楼 snmr_com 的回复:
1.py在国内人气不高,原因心照不提,因此这边也不会太多人在线 国外就不同了,stackoverflow.com上面问py问题和解答的多呢 2.fork是*nix体系的,你也该明白国内windows是一统天下的,剩下的…… 3.上面两点是相乘关系,结果就如此 不要抱怨CSDN或者别人怎样……因为找不到答案永远不是别人的问题,这个是应该从小孩就该明白的道理……
难理解是上面出现了两次fork()操作。
ImN1 2013-01-22
  • 打赏
  • 举报
回复
1.py在国内人气不高,原因心照不提,因此这边也不会太多人在线 国外就不同了,stackoverflow.com上面问py问题和解答的多呢 2.fork是*nix体系的,你也该明白国内windows是一统天下的,剩下的…… 3.上面两点是相乘关系,结果就如此 不要抱怨CSDN或者别人怎样……因为找不到答案永远不是别人的问题,这个是应该从小孩就该明白的道理 我也不懂*nix,尝试从程序的理解给个自己的答案,不对你就继续寻找正确答案 Fork a child process. Return 0 in the child and the child’s process id in the parent. 就是新开了子进程,具体你再参考*nix的man,我说不上什么 而且程序似乎把输出都刷掉了——for f in sys.stdout, sys.stderr: f.flush() 这样的效果就相当于后台进行
seai 2013-01-22
  • 打赏
  • 举报
回复
CSDN的作风越来越不怎么样了。 问个问题,要么没人理,要么贴个不相关的链接。 我是想理解上面代码的原理,不是来询问是否有现成工具直接使用的。
ImN1 2013-01-22
  • 打赏
  • 举报
回复
对啊,setsid也是*nix相关的函数,跟我的理解是一样的,提升进程级别,不过确实没接触过,不想就给你个猜测的答案 BTW:你可以注册个马甲接分的,自问自答(或者路过也拿满分)这事我见得多了
seai 2013-01-22
  • 打赏
  • 举报
回复
还有一点,这个更多是系统知识,我其实应该去linux区问的。
seai 2013-01-22
  • 打赏
  • 举报
回复
老实说,这分应该奖励给自己。可惜CSDN不能给自己奖励。就送你们了。
ImN1 2013-01-22
  • 打赏
  • 举报
回复
你看,自己解决多好,哇咔咔卡……
seai 2013-01-22
  • 打赏
  • 举报
回复
我自己来加注释了: def daemonize(self, stdin = '/dev/null', stdout = '/dev/null', stderr = '/dev/null'): try: pid = os.fork() if pid > 0: #父进程执行时退出 -- 脱离了父进程 sys.exit(0) except OSError, e: sys.exit(4) os.chdir('/') #设置当前工作目录 os.umask(0) #设置文件创建权限 os.setsid() #在新的进程组中运行进程,并成为“session leader” -- 脱离了终端 try: pid = os.fork() #再次fork后,进程已经不再是“session leader”,这样它就能打开任何文件(包括终端)且不会意外地再次获得一个控制终端 if pid > 0: sys.exit(0) except OSError, e: sys.exit(4) for f in sys.stdout, sys.stderr: f.flush() si = file(stdin, 'r') so = file(stdout, 'a+') se = file(stderr, 'a+', 0) #重定向标准输入/输出/错误 os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno())
bugs2k 2013-01-18
  • 打赏
  • 举报
回复

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧