Chinaunix首页 | 论坛 | 博客
  • 博客访问: 827373
  • 博文数量: 168
  • 博客积分: 5431
  • 博客等级: 大校
  • 技术积分: 1560
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-22 11:56
文章存档

2015年(2)

2014年(1)

2013年(12)

2012年(12)

2011年(15)

2010年(5)

2009年(16)

2008年(41)

2007年(64)

分类: LINUX

2007-10-29 19:33:01

关于僵尸进程以及exec的使用
前些日子为了公司的Power 4 Gear项目编写daomon进程,遇到一个小小的问题。现在已经解决,问题涉及的知识如下:
问题:
    需要父进程根据不同的按键fork一个子进程来完成指定任务(例如:mail程序,IE等等)但是由于daomon进程是以系统服务的形式启动的,此时无论GNOME还是KDE都没有初始化,因此子进程中没有足够的KDE/GNOME相关的环境变量在必要的时候执行UI相关的程序。因此,我试图在使用execve来将环境变量传递进去,理论是可行的,实际表明:对于环境变量较少的情况下,可行;对于复杂的情况,由于环境变量过于复杂实际是无法全部传递进去的。所以,我选择了在UI的初始化脚本中启动daomon进程,然后改用execv来从父进程继承环境变量(此时UI已经初始化环境变量完整),这样问题就迎刃而解。
    另外,子进程运行以后停止的时间是不确定的(由用户决定),此时,我们希望父进程继续执行代码,但是默认的情况是:父亲要wait子进程获取它的结束状态(子进程结束会发送SIGCLD信号给父进程)。父进程会block在那里,与我的要求不符。怎么办?我们不要马上wait子进程,但有一个问题:僵尸进程出来了,那么又该怎么办?还好linux并不是很死板,它允许我们在fork的时候忽略子进程的SIGCLD信号,这样系统自动会在子进程退出的时候回收所有资源包括进程slot(忽略SIGCLD信号方法:使用int  sigaction(int  signum,  const  struct  sigaction  *act,  struct sigaction *oldact);来设置信号的行为);另外还有一个方法,在APUE里面已经有说明:就是fork两次(让父进程结束),子进程在退出后发现父进程已经结束,自己成为孤儿进程,系统自动将它挂到init下而init进程会周期调用waitpid回收进程slot,也就避免了僵尸进程的产生。
阅读(1154) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~