守護行程也稱精靈行程(Daemon),是運行在后臺的一種特殊行程,守護行程獨立于控制終端,它們常常跟隨系統啟動時啟動,在系統關閉時才結束,守護行程周期性的執行某些任務或者等待處理某些事件,Linux上的大多數服務器都是用守護行程實作的,
在系統啟動中默認的守護行程的父行程ID全都是init,守護行程特征就是在程式運行名后加了一個d,但不是所有的尾字母是d的行程都是守護行程,
要創建一個守護行程,我們需要:
1.呼叫umask()函式,將檔案模式創建屏蔽字設定為0
umask(0); //用umask將檔案模式創建屏蔽字設定為0
2.呼叫fork函式,退出父行程,(用來保證守護行程不是行程組長)
if(fork() == 0) //fork子行程,關閉父行程
{}
else
{
exit(0);
}
3.呼叫setsid創建一個會話(setsid的作用:呼叫行程成為新會話的首行程、呼叫行程成為一個新行程組的組長行程、呼叫行程沒有控制終端)
setsid(); //讓子行程成為一個守護行程
4.將當前作業目錄更改為根目錄(系統中除了根目錄都可以被洗掉,要避免守護行程被洗掉)
chdir("/"); //更改當前目錄為根目錄
5.關閉不需要的檔案描述符
close(0); //關閉默認的檔案描述符表
close(1);
close(2);
6.忽略SIGCHLD信號;
signal(SIGCHLD, SIG_DFL); //忽略SIGCHLD信號
自己創建一個守護行程的完整代碼如下:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
void mydaemon()
{
umask(0);
if(fork() == 0)
{}
else{
exit(0);
}
setsid();
chdir("/");
close(0);
close(1);
close(2);
signal(SIGCHLD, SIG_DFL);
}
int main()
{
mydaemon();
while(1)
{}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275563.html
標籤:其他
上一篇:Linux---行程信號
