linux 守护进程(daemon)的创建方法

用C语言来创建守护进程方法大致如下:

  1. int init_daemon(const char *pathname)
  2. {
  3.     struct sigaction act;
  4.     int max_fd, i, ret;
  5.     char buf[100];

  6.     /* 第一次调用fork,为setsid做准备 */
  7.     ret = fork();
  8.     if( 0 > ret )
  9.     {
  10.         fprintf(stderr, "error in first fork./n");
  11.         exit(1);
  12.     }
  13.     else if( 0 != ret) /* 父进程退出 */
  14.         exit(0);
  15.     
  16.     /* 第一次fork的子进程部分 */
  17.    
  18.     /* 调用setsid,使得进程与旧会话过程相分离 */
  19.     ret = setsid();
  20.     if( 0 > ret )
  21.         exit(1);
  22.     
  23.     /* 忽略信号SIGHUP */ 
  24.     act.sa_handler = SIG_IGN;
  25.     sigemptyset(&act.sa_mask);
  26.     act.sa_flags = 0;
  27.     sigaction(SIGHUP, &act, NULL);

  28.     /* 第二次fork,使得进程不再是会话过程的领头进程,不能打开终端作伪自己的控制终端*/
  29.     ret = fork();
  30.     if(0 > ret)
  31.          exit(1);
  32.     else if( 0 != ret ) /* 父进程退出 */
  33.          exit(0);

  34.     /* 第二次fork的子进程部分 */

  35.     /* 修改进程的当前目录 */
  36.     chdir("/");
  37.     /* 清除进程的文件掩码 */
  38.     umask(0);
  39.     /* 使得进程退出原来的进程组,不受原来进程组的干扰 */
  40.     setpgrp();

  41.     /* 关闭进程所有的文件描述符 */
  42.     max_fd = sysconf(_SC_OPEN_MAX);
  43.     for(i = 0; i < max_fd; i++)
  44.         close(i);

  45.     /* 打开空设备,让原来的输入输出移到该设备处 */
  46.     open("/dev/null", O_RDWR);
  47.     dup(1);
  48.     dup(2);
  49.     
  50.     /* 打开系统日志 */
  51.     openlog(pathname, LOG_PID, 0);

  52.     return 0;
  53. }


发布了54 篇原创文章 · 获赞 16 · 访问量 34万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章