1.什么是守護進程
守護進程,也就是通常說的Daemon(精靈)進程,
是Linux中的一種服務進程。它的特點是:
不占用控制終端(后臺運行)
獨立于控制終端
周期性運行
例如:smbd
2.1 后臺運行
守護進程需要獨立于任何一個控制終端。實現(xiàn)方法調用是通
過創(chuàng)建子進程來充當守護進程,而父進程退出,這樣子進程
就可以在后臺運行。(范例展示)
pid=fork();
if(pid>0)
exit(0); //父進程退出
else (pid==0)
{
//守護進程
}
2.2 獨立于控制終端
守護進程不能占用控制終端,因此需要在后臺運行。實現(xiàn)方法是調用setsid()函數(shù)。
pid=fork();
if(pid>0)
exit(0); //父進程退出
else (pid==0) //守護進程
{
setsid();
。。。。。。
}
2.3.1 修改工作目錄
進程活動時,其工作目錄所在的文件系統(tǒng)不能卸載。例如:我們是從/mnt/usb目錄下啟動該守護進程的,那么如果守護進程的工作目錄就是/mnt/usb,我們就無法在守護進程
還在運行的情況下umount /mnt/usb。所以一般需要將守護的工作目錄切換到根目錄。
chdir("/");
2.3.2 修改文件權限掩碼
文件權限掩碼是指屏蔽掉文件權限中的對應位。比如掩碼是00,它就屏蔽了文件創(chuàng)建者的可讀與可執(zhí)行權限。由于子進程要繼承父進程的文件權限掩碼,這勢必影響子進程中新
創(chuàng)建的文件的訪問權限,為避免該影響,就需要重新對子進程中的權限掩碼清零。通常的使用方法為函數(shù):
mask(0);
2.3.3 關閉打開文件
同文件權限碼一樣,子進程還會從父進程那里繼承一些已經打開了的文件。這些被打開的文件可能永遠不會被守護進程讀寫,但它們一樣消耗系統(tǒng)資源,而且會導致文件所在的文
件系統(tǒng)無法卸載。因此在子進程中需要將這些文件關閉。
for(i=0;i<MAXFILE;i++)
close(i);
#include