生活随笔
收集整理的這篇文章主要介紹了
普通进程的守护进程化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
?????自定義一個(gè)daemon_init函數(shù),涉及到知識(shí)點(diǎn)為“如何創(chuàng)建一個(gè)daemon(守護(hù)進(jìn)程)”,實(shí)現(xiàn)步驟如下:
fork之后殺掉父進(jìn)程(此時(shí)子進(jìn)程被init收養(yǎng))這是為了為下一步setsid做準(zhǔn)備,因?yàn)橹挥胁皇沁M(jìn)程組首進(jìn)程的進(jìn)程才能調(diào)用setsid,setsid,創(chuàng)建一個(gè)新的會(huì)話并斷開與之前的控制終端的關(guān)系,再次fork并殺掉首進(jìn)程, 這樣就確保了子進(jìn)程不是一個(gè)會(huì)話首進(jìn)程, 根據(jù)linux中獲取終端的規(guī)則(只有會(huì)話首進(jìn)程才能請(qǐng)求一個(gè)控制終端), 這樣進(jìn)程永遠(yuǎn)不會(huì)重新請(qǐng)求一個(gè)控制終端清楚進(jìn)程的umask,確保daemon創(chuàng)建文件和目錄時(shí)擁有相應(yīng)的權(quán)限修改進(jìn)程的當(dāng)前工作目錄, 通常修改到/目錄關(guān)閉進(jìn)程所有不再需要的文件描述符打開/dev/null使文件描述符0、1、2指向這個(gè)設(shè)備, 以防止daemon調(diào)用在這些描述符上做I/O操作的庫(kù)函數(shù)而不會(huì)意外的失敗
#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 */
}
?
引申知識(shí),作業(yè)控制以及相關(guān)命令:
?
?
?
ctrl+c和ctrl+z都是中斷命令,但是他們的作用卻不一樣.
ctrl+c是強(qiáng)制中斷程序的執(zhí)行,
而ctrl+z的是將任務(wù)中斷,但是此任務(wù)并沒有結(jié)束,他仍然在進(jìn)程中他只是維持掛起的狀態(tài),用戶可以使用fg/bg操作繼續(xù)前臺(tái)或后臺(tái)的任務(wù),fg命令重新啟動(dòng)前臺(tái)被中斷的任務(wù),bg命令把被中斷的任務(wù)放在后臺(tái)執(zhí)行.
例如:
當(dāng)你vi一個(gè)文件是,如果需要用shell執(zhí)行別的操作,但是你又不打算關(guān)閉vi,因?yàn)槟愕?br /> 存盤推出,你可以簡(jiǎn)單的按下ctrl+z,shell會(huì)將vi進(jìn)程掛起~,當(dāng)你結(jié)束了那個(gè)shell操作之后,你可以用fg命令繼續(xù)vi你的文件.
總結(jié)
以上是生活随笔為你收集整理的普通进程的守护进程化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。