so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          daemonize

          #include <sys/param.h>
          #include <signal.h>
          #include <stdlib.h>
          #include <fcntl.h>
          #include <unistd.h>
          #include <sys/stat.h>
          void daemonize() {
              int pid = -1, fd = -1;
              // 1.轉(zhuǎn)變?yōu)楹笈_進程
              if ((pid = fork()) == -1) exit(1);
              if (pid != 0) exit(0); // 父進程(前臺進程)退出
              // 2.離開原先的進程組,會話
              if (setsid() == -1) exit(1); // 開啟一個新會話
              // 3.禁止再次打開控制終端
              if ((pid = fork()) == -1) exit(1);
              if (pid != 0) exit(0); // 父進程(會話領(lǐng)頭進程)退出
              // 4.關(guān)閉打開的文件描述符,避免浪費系統(tǒng)資源
              for (int i = 0; i < NOFILE; i++)
                  close(i);
              // 5.改變當前的工作目錄,避免卸載不了文件系統(tǒng)
              if (chdir("/") == -1) exit(1);
              // 6.重設(shè)文件掩碼,防止某些屬性被父進程屏蔽,也有設(shè)置為0027的(守護進程創(chuàng)建的臨時文件不希望被其他用戶查看)
              umask(0);
              // 7.重定向標準輸入,輸出,錯誤流,因為守護進程沒有控制終端
              // 如果只是把0、1、2都close了,那么守護進程里新創(chuàng)建的文件fd會用到0、1、2,如果用戶的代碼里有用到printf/cout之類的,那就會把數(shù)據(jù)打到新創(chuàng)建的文件中,這樣就會產(chǎn)生混淆
              if ((fd = open("/dev/null", O_RDWR)) == -1) exit(1); // 打開一個指向/dev/null的文件描述符
              dup2(fd, STDIN_FILENO);
              dup2(fd, STDOUT_FILENO);
              dup2(fd, STDERR_FILENO);
              close(fd);
              // 8.本守護進程的子進程若不需要返回信息,那么交給init進程回收,避免產(chǎn)生僵尸進程,否則子進程退出后將成為僵尸進程
              if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) exit(1);
          }

          對setsid闡述較透徹:http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html
          對終端的事說了些:http://blog.51cto.com/10541559/1771212
          對syslog的事說了些:https://www.linuxidc.com/Linux/2015-01/111933.htm
          此外,man 3 daemon這個庫函數(shù)只實現(xiàn)了部分階段(例如沒有屏蔽SIGCHLD以及對mask做任何處理):https://github.com/lattera/glibc/blob/master/misc/daemon.c

          posted on 2018-04-12 18:36 so true 閱讀(183) 評論(0)  編輯  收藏 所屬分類: Linux

          主站蜘蛛池模板: 青川县| 高碑店市| 田阳县| 淮北市| 浦北县| 绥中县| 镇巴县| 洮南市| 新泰市| 雷山县| 汤原县| 交城县| 金乡县| 方城县| 紫阳县| 若羌县| 贵南县| 富源县| 保靖县| 大英县| 彭泽县| 广宗县| 永寿县| 长垣县| 卓资县| 昌平区| 南岸区| 博野县| 马尔康县| 孟津县| 军事| 平原县| 家居| 启东市| 凯里市| 农安县| 英山县| 佛教| 巨鹿县| 文水县| 新营市|