我参考经典代码(unix高级编程里的)写了一个守护进程,我在守护进程里每隔半分钟syslog一下它的pid和ppid。但是,第一个输出:ppid为25672,pid为25673 以后的输出都是:ppid为1, pid为25673.
为什么第一个输出不是1?
下面是代码:
其中:
logit是我对syslog的封装,
daemon_init是“圣经”(unix高级编程)上的创建守护进程的代码。
int main(int argc, char* argv[])
{
logit("/tmp/test.log", 0, TRUE, "this is a test print 1 in log");
daemon_init("/var/run/test.pid",TRUE,"/tmp/test.log");
logit("/tmp/test.log", 1, FALSE, "this is a test print 2 in log");
while(1){
logit("/tmp/test.log",3,FALSE,"i am a daemon:%d->%d",getppid(),getpid());
sleep(30);
}
}
linux 守护进程的ppid的疑惑
答案:2 悬赏:60 手机版
解决时间 2021-02-05 03:18
- 提问者网友:謫仙
- 2021-02-04 18:41
最佳答案
- 五星知识达人网友:往事隔山水
- 2021-02-04 19:06
如果你不是用init脚本启动而是由命令行启动的话,第一次启动的ppid是第一次daemon_init函数中第一次fork后的子进程的ID,pid是第二次fork后子进程的ID,第一次循环运行时,可能其父进程还未完全退出,或者系统清理过程还未执行,所以不是1,以后的循环中,由于第一次fork的子进程已经结束,第二次fork的子进程成为孤儿进程,被init接管,所以其ppid为1,而其自己的pid并未改变
全部回答
- 1楼网友:拾荒鲤
- 2021-02-04 19:37
某一个进程在结束时由它的父进程负责删除它。要找到某一个进程的父进程,执行ps -ef命令,输出中的ppid列给出了一个进程的父进程的进程号。
(1)如果ppid为1应该如何做?
如果一个defunct进程的ppid为1,则该defunct进程的父进程为init进程。init进程是系统中所有进程的起源。通常情况下,init进程通过将defunct进程的ppid设为1来收回该进程。
如果一个defunct进程的父进程号为1,则需要确认该defunct进程是否已结束了若干分钟。(方法是等几分钟后再查看该defunct进程是否还存在。)一个系统中,特别是任务繁忙的系统中,父进程为init的defunct进程存在1~2分钟是正常的。defunct进程经常由复杂的shell脚本程序产生,这种情况通常是正常的,并不能说明有问题存在。
当init进程没有处理完/etc/inittab文件而在等其中的某一项命令结束(通常是一个/etc/rc脚本)时,可能会发生问题。在这时候,init进程会忽略掉其它所有结束的子进程,而只等这个特定的子进程结束。由一个挂起的/etc/inittab文件中的任务引起的问题的征兆是:父进程为init的defunct进程无限制的增长。在aix4.3及以后的版本中,init进程的功能被增强,用以有效地处理defunct进程。
如果/etc/inittab文件中含有类似下一行的项,则删除它:
install_assist:2:wait:/usr/lib/lpd/pio/etc/pioinit >; /dev/null 2>;&1
该进程会引起defunct进程。该项应在初始化安装结束后被自动删除。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯