关于僵尸进程以及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,也就避免了僵尸进程的产生。
阅读(1195) | 评论(0) | 转发(0) |