快速业务通道

Linux 守护进程

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-30

1. 概述
守护进程(精灵进程)是一种生存期长的进程.
<1> 通常在系统引导装入时启动,在系统关闭时终止.
<2> 没有控制终端,在后台运行.

2 一些特征
<1> 所有守护进程都以超级用户(ROOT 用户ID为0)的优先权运行,
<2> 除update以外,所有守护进程都是进程组和会话期的首进程
<3> 所有守护进程的父进程都是init进程

3编程规则
<1>调用fork,结束父进程.
·若该守护进程由shell命令启动,那么父进程终止后,shell认为命令结束,终端停止.
·子进程继承父进程的进程组ID,子进程不是一个进程组的首进程.
<2>调用setsid创建一个新的会话期.
·使子进程成为新会话期的首进程,
·成为一个新进程组的首进程,
·没有控制终端
<3>将当前工作目录改为系统根目录
·当前工作目录由父进程继承而来
·若当前目录在一个装配文件系统中,则该文件系统不能被拆卸,因此需要更改当前目录.
·也可当当前工作目录修改为其他目录
<4>将文件方式创建屏蔽字设置为0
·文件方式创建屏蔽字有父进程继承的来
·此屏蔽可能会拒绝某些许可的创建,因此设置为0
<5>关闭不再需要的文件描述符

举例:

  1. #include<sys/types.h>
  2. #include<sys/stat.h>
  3. #include<signal.h>
  4. #include<unistd.h>
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<sys/types.h>
  10. #include<sys/stat.h>
  11. #include<signal.h>
  12. #include<fcntl.h>
  13. #include <syslog.h>
  14. #define MAXF 10000
  15. int main()
  16. {
  17. int i,fd;
  18. pid_t pid;
  19. pid=fork();/*<1> 创建子进程,结束父进程*/
  20. if(pid<0)
  21. perror("fork error!\n");
  22. else if(pid>0)/*父进程*/
  23. exit(0);
  24. setsid();/*<2>创建会话期,进程成为新的会话组长和新的进程组长*/
  25. chdir("/");/*<3>更改当前工作目录*/
  26. umask(0);/*<4>设置文件权限*/
  27. for(i=1;i<MAXF;i )/*<5>关闭文件描述符*/
  28. close(i);
  29. /*每5秒,写入文件一次*/
  30. while(1)
  31. {
  32. if((fd=open("/tmp/proc.log",O_CREAT|O_WRONLY|O_APPEND))<0)
  33. {
  34. perror("open error!\n");
  35. exit(0);
  36. }
  37. write(fd,"Hi dameon!\n",12);
  38. close(fd);
  39. sleep(5);
  40. }
  41. }

结果:

cat命令查看/tmp/proc.log,每5秒会写入一次 Hi dameon!

若要关闭此守护进程,使用ps -e查看,再kill关闭即可