LALA  
          日歷
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          留言簿(1)

          隨筆分類(31)

          文章分類(4)

          收藏夾(21)

          搜索

          •  

          積分與排名

          • 積分 - 29910
          • 排名 - 1389

          最新隨筆

          最新評論

          閱讀排行榜

           
              守護進程運行在后臺,不與任何控制終端相關聯.守護進程以root用戶運行或者其他特殊的用戶,并處理一些系統級的任務, 習慣上守護進程的名字以d結尾,但不是必須的.
              對守護進程的兩個基本要求: 它必須是init進程的子進程; 不與任何控制終端相關聯.
              一般來講, 進程可以通過以下步驟成為守護進程:
          1. 調用fork(), 創建新的進程, 它會是將來的守護進程.
          2. 在守護進程的父進程中調用exit(). 這保證祖父進程(守護進程的祖父進程)確認父進程已經結束. 還保證父進程不再繼續運行, 守護進程不是組長進程. 最后一點是順利完成一下步驟的前提.
          3. 調用setsid(), 使得守護進程有一個新的進程組和新的會話, 兩者都把它作為首進程, 這也保證它不會與控制終端相關聯.
          4. 用chdir()將當前工作目錄改為根目錄. 因為前面調用fork()創建了新進程, 它所繼承來的當前工作目錄可能在文件系統的任何地方. 而守護進程通常在系統啟動時運行, 同時不希望一些隨機目錄保持打開狀態, 也就阻止了管理員卸載守護進程工作目錄所在的那個文件系統.
          5. 關閉所有的文件描述符. 不需要繼承任何打開的文件描述符, 對于無法確認的文件描述符, 讓它們繼續處于打開狀態.
          6. 打開0, 1和2號文件描述符(標準輸入, 標準輸出和標準錯誤), 把它們重定向到/dev/null.
          根據這些規則, 下面程序可以成為守護進程:
           1 #include<sys/types.h>
           2 #include<sys/stat.h>
           3 #include<stdlib.h>
           4 #include<stdio.h>
           5 #include<fcntl.h>
           6 #include<unistd.h>
           7 #include<linux/fs.h>
           8 
           9 int main(void)
          10 {
          11  pid_t pid;
          12  int i;
          13  /* create new process */
          14  pid = fork();
          15  if(pid == -1return -1;
          16  else if(pid != 0) exit(EXIT_SUCCESS);
          17  /* create new session and process group */
          18  if(setsid() == -1return -1;
          19  /* set the working directory to the root directory*/
          20  if(chdir("/"== -1return -1;
          21  /* close all open files -- NR_OPEN is overkill, but works */
          22  for(i = 0; i < NR_OPEN; i++) close(i);
          23  /* redirect fd's 0, 1, 2 to /dev/null */
          24  open("/dev/null", O_RDWR); /* stdin */
          25  dup(0); /* stdout */
          26  dup(0); /* stderr */
          27  /* do it daemon thing.*/
          28  
          29  return 0;
          30 }

          許多Unix系統在它們的C函數庫中提供了daemon()函數來完成這些工作:
          #include <unistd.h>
          int daemon(int nochdir, int noclose);

          posted on 2009-12-11 11:33 Dest 閱讀(1007) 評論(0)  編輯  收藏 所屬分類: Linux
           
          Copyright © Dest Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 阳曲县| 容城县| 安溪县| 文化| 康定县| 清水县| 连州市| 绥滨县| 泽库县| 横峰县| 自治县| 岫岩| 左贡县| 大城县| 金湖县| 拉萨市| 呼图壁县| 宁都县| 金寨县| 遂川县| 乌海市| 阜阳市| 林州市| 响水县| 四平市| 司法| 萨嘎县| 龙陵县| 清镇市| 五河县| 邢台县| 塔城市| 封开县| 大厂| 章丘市| 年辖:市辖区| 贡山| 政和县| 翁源县| 浑源县| 成安县|