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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章