日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

普通进程的守护进程化

發布時間:2025/3/21 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 普通进程的守护进程化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

?????自定義一個daemon_init函數,涉及到知識點為“如何創建一個daemon(守護進程)”,實現步驟如下:

  • fork之后殺掉父進程(此時子進程被init收養)這是為了為下一步setsid做準備,因為只有不是進程組首進程的進程才能調用setsid,
  • setsid,創建一個新的會話并斷開與之前的控制終端的關系,
  • 再次fork并殺掉首進程, 這樣就確保了子進程不是一個會話首進程, 根據linux中獲取終端的規則(只有會話首進程才能請求一個控制終端), 這樣進程永遠不會重新請求一個控制終端
  • 清楚進程的umask,確保daemon創建文件和目錄時擁有相應的權限
  • 修改進程的當前工作目錄, 通常修改到/目錄
  • 關閉進程所有不再需要的文件描述符
  • 打開/dev/null使文件描述符0、1、2指向這個設備, 以防止daemon調用在這些描述符上做I/O操作的庫函數而不會意外的失敗
  • #include "unp.h" #include <syslog.h>#define MAXFD 64extern int daemon_proc; /* defined in error.c */int daemon_init(const char *pname, int facility) {int i; pid_t pid;if ( (pid = Fork()) < 0)return (-1);else if (pid)_exit(0); /* parent terminates *//* child 1 continues... */if (setsid() < 0) /* become session leader */return (-1);Signal(SIGHUP, SIG_IGN);if ( (pid = Fork()) < 0)return (-1);else if (pid)_exit(0); /* child 1 terminates *//* child 2 continues... */daemon_proc = 1; /* for err_XXX() functions */chdir("/"); /* change working directory *//* close off file descriptors */for (i = 0; i < MAXFD; i++)close(i);/* redirect stdin, stdout, and stderr to /dev/null */open("/dev/null", O_RDONLY);open("/dev/null", O_RDWR);open("/dev/null", O_RDWR);openlog(pname, LOG_PID, facility);return (0); /* success */ }

    ?

    引申知識,作業控制以及相關命令:

    ?

    ?

    ?

    ctrl+c和ctrl+z都是中斷命令,但是他們的作用卻不一樣.
    ctrl+c是強制中斷程序的執行,
    而ctrl+z的是將任務中斷,但是此任務并沒有結束,他仍然在進程中他只是維持掛起的狀態,用戶可以使用fg/bg操作繼續前臺或后臺的任務,fg命令重新啟動前臺被中斷的任務,bg命令把被中斷的任務放在后臺執行.
    例如:
    當你vi一個文件是,如果需要用shell執行別的操作,但是你又不打算關閉vi,因為你得
    存盤推出,你可以簡單的按下ctrl+z,shell會將vi進程掛起~,當你結束了那個shell操作之后,你可以用fg命令繼續vi你的文件.

    總結

    以上是生活随笔為你收集整理的普通进程的守护进程化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。