什麼是守護進程
守護進程也稱精靈進程(Daemon),是運⾏在後臺的⼀種特殊進程。它獨⽴於控制終端並且週期性地執⾏某種任務或等待處理某些發⽣的事件。守護進程是⼀種很有⽤的進程。 Linux的⼤多數服務器就是⽤守護進程實現的。⽐如, ftp服務器, ssh服務器, Web服務器httpd等。同時,守護進程完成許多系統任務。⽐如,作業規劃進程crond等。
Linux系統啓動時會啓動很多系統服務進程,這些系統服務進程沒有控制終端,不能直接和⽤戶交互。其它進程都是在⽤戶登錄或運⾏程序時創建,在運⾏結束或⽤戶註銷時終⽌,但系統服務進程(守護進程)不受⽤戶登錄註銷的影響,它們⼀直在運⾏着。這種進程有⼀個名稱叫守護進程(Daemon)。
守護進程有如下幾個特點:
- 獨立於控制終端,不與任何終端建立聯繫
- 不受用戶的登陸註銷的影響
- 運行在後臺
守護進程的“進化史”
在這裏插入圖片描述
代碼實現
//守護進程進化史:
//1.創建一個孤兒進程
//2.在孤兒進程內創建一個新會話
//3.修改默認工作路徑爲"/"
//4.重定向文件描述符到"/dev/null"
//5.設置文件的默認權限掩碼
//6.確保自身不是會話首進程,從而不和任何終端建立聯繫
//7,成功逆襲成爲守護進程
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<error.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void MyDaemon()
{
int pid = fork();
if (pid < 0)
{
exit(-1);
}
else if (pid > 0)
{
exit(0);
}
//創建孤兒進程完成
int sid = setsid();
if (sid < 0)
{
exit(-1);
}
//創建會話完成
chdir("/");//修改默認工作路徑
int fd = open("/dev/null",O_RDWR);
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);//文件描述符重定向
umask(0);//修改默認權限
pid = fork();
if (pid < 0)
{
exit(-1);
}
else if (pid > 0)
{
exit(0);
}
//創建孫子進程,孫子進程不是該會話的首進程(受進程是剛纔退出的孤兒進程,)。
//這樣做能保證該進程不和任何終端建立聯繫。
}//創建成功
int main()
{
MyDaemon();
while(1)
{
sleep(1);
}
return 0;
}
⽤ps axj命令查看系統中的進程。參數a表⽰不僅列當前⽤戶的進程,也列出所有其他⽤ 戶的進程,參
數x表⽰不僅列有控制終端的進程,也列出所有⽆控制終端的進程,參數j表⽰列出與 作業控制相關的信息。
測試結果:
其中PPID等於1說明他是一個孤兒進程,TTY 等於 ?說明不與任何任何終端有聯繫。
當然創建守護進程也可以調用deamon函數:
#include <unistd.h>
int daemon(int nochdir, int noclose);
參數:
nochdir: 爲0則修改默認工作路徑
noclose:爲0則重定向文件描述符