六十 如何写一个简单的守护(精灵)进程原型

本文深入解析了守护进程的初始化过程,包括如何设置信号处理、关闭文件描述符、改变工作路径等关键步骤,确保守护进程在后台稳定运行。

这里首先假设读者知道守护进程的大概概念,下面我们直接看程序。

//****************

环境,OS = Ubuntu 10.4 编译器 = gcc 4.5.2

******************//

[plain]  view plain copy
  1. int main(int argc, char **argv)  
  2.   
  3. {  
  4.   
  5.    //因为下面要关掉某些信号,所以需要  
  6.   
  7.     struct sigaction sa;  
  8.   
  9.    int i, fd, fdtablesize;  
  10.   
  11.       
  12.   
  13.    //上来第一件事,调用umask将文件模式创建屏蔽字设置为0,为的是防止守护进程可能不具有对文件读写的权限  
  14.   
  15.     umask(0);  
  16.   
  17. //设置信号处理函数,SIG_IGN为忽略信号  
  18.   
  19.   sa.sa_handler = SIG_IGN;  
  20.   
  21. //sa.sa_mask这个成员的清零,一定要使用sigemtpy函数  
  22.   
  23. sigemptyset(&sa.sa_mask);  
  24.   
  25. sa.sa_flags = 0;  
  26.   
  27. //对以下几种信号做忽略处理  
  28.   
  29. sigaction(SIGTTOU, &sa, NULL);  
  30.   
  31. sigaction(SIGTTIN, &sa, NULL);  
  32.   
  33. sigaction(SIGTSTP, &sa, NULL);  
  34.   
  35. sigaction(SIGUP, &sa, NULL);  
  36.   
  37.    
  38.   
  39. //关闭父进程,使子进程成为孤儿进程,从而被init收养  
  40.   
  41. if(fork() != 0)  
  42.   
  43. {  
  44.   
  45.        exit(1);  
  46.   
  47. }     
  48.   
  49. //创建一个新会话  
  50.   
  51. if(setsid() < 0)  
  52.   
  53. {  
  54.   
  55.      exit(1);  
  56.   
  57. }  
  58.   
  59. //第二次退出父进程  
  60.   
  61. if(fork() != 0)  
  62.   
  63. {  
  64.   
  65.        exit(1);  
  66.   
  67. }  
  68.   
  69. //改变工作路径到root,防止出现工作目录被卸载的情况  
  70.   
  71. if(chidr("/") == -1)  
  72.   
  73. {  
  74.   
  75.       exit(1);  
  76.   
  77. }  
  78.   
  79. //关闭打开的文件描述符,包括标准输入输出和标准出错  
  80.   
  81. for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)  
  82.   
  83. {  
  84.   
  85.       close(fd);  
  86.   
  87. }  
  88.   
  89. //再次关掉信号  
  90.   
  91. sigaction(SIGCHLD, &sa, NULL);  
  92.   
  93. //进入一个死循环让守护进程常驻内存  
  94.   
  95. while(1)  
  96.   
  97. {  
  98.   
  99.       //do somthing  
  100.   
  101.        sleep(1);  
  102.   
  103. }  
  104.   
  105. //至此就完成了对一个守护进程的初始化  
  106.   
  107. return 0;  
  108.   
  109. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值