linux下如何創(chuàng)建守護(hù)進(jìn)程的步驟
這兩天學(xué)習(xí)了linux 守護(hù)進(jìn)程這個(gè)地方知識(shí)點(diǎn)挺多的,而且很重要,所以,今天添加一點(diǎn)小筆記。
1,進(jìn)程的概念:程序的一次動(dòng)態(tài)執(zhí)行過程。
進(jìn)程存在于內(nèi)存當(dāng)中,存在著 創(chuàng)建,調(diào)度,執(zhí)行和消亡,進(jìn)程號(hào)是進(jìn)程的唯一標(biāo)志,每一個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間,在32位操作系統(tǒng)中,進(jìn)程擁有0-4G的內(nèi)存空間,其中0-3G屬于用戶,3G-4G屬于內(nèi)核,所以就出現(xiàn)了進(jìn)程的執(zhí)行模式:用戶模式和內(nèi)核模式。
2,進(jìn)程的類型:交互進(jìn)程,批處理進(jìn)程,守護(hù)進(jìn)程
3,守護(hù)進(jìn)程:Linux中的后臺(tái)服務(wù)進(jìn)程,daemon進(jìn)程
4,守護(hù)進(jìn)程的創(chuàng)建步驟:
(1)創(chuàng)建子進(jìn)程,父進(jìn)程退出。
經(jīng)過這步以后,子進(jìn)程就會(huì)成為孤兒進(jìn)程(父進(jìn)程先于子進(jìn)程退出, 此時(shí)的子進(jìn)程,成為孤兒進(jìn)程,會(huì)被init進(jìn)程收養(yǎng))。使用fork()函數(shù),如果返回值大于0,表示為父進(jìn)程,exit(0),父進(jìn)程退出,子進(jìn)程繼續(xù)。
(2)在子進(jìn)程中創(chuàng)建新會(huì)話,使當(dāng)前進(jìn)程成為新會(huì)話組的組長。
使用setsid()函數(shù),如果當(dāng)前進(jìn)程不是進(jìn)程組的組長,則為當(dāng)前進(jìn)程創(chuàng)建一個(gè)新的會(huì)話期,使當(dāng)前進(jìn)程成為這個(gè)會(huì)話組的首進(jìn)程,成為這個(gè)進(jìn)程組的組長。
(3)改變當(dāng)前目錄為根目錄。
由于守護(hù)進(jìn)程在后臺(tái)運(yùn)行,開始于系統(tǒng)開啟,終止于系統(tǒng)關(guān)閉,所以要將其目錄改為系統(tǒng)的根目錄下。進(jìn)程在執(zhí)行時(shí),其文件系統(tǒng)不能被卸下。
(4)重新設(shè)置文件權(quán)限掩碼。
進(jìn)程從父進(jìn)程那里繼承了文件創(chuàng)建掩碼,所以可能會(huì)修改守護(hù)進(jìn)程存取權(quán)限位,所以要將文件創(chuàng)建掩碼清除,umask(0);
(5)關(guān)閉文件描述符。
子進(jìn)程從父進(jìn)程那里繼承了打開文件描述符。所以使用close即可關(guān)閉。
在這里要用到getdtablesize()函數(shù)得到這個(gè)進(jìn)程打開文件的數(shù)目。
按照上面的步驟即可完成守護(hù)進(jìn)程的創(chuàng)建。
具體的代碼如下,守護(hù)進(jìn)程的功能寫的較為簡單,往文件里寫東西:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
int main()
{ // 1創(chuàng)建子進(jìn)程 ,父進(jìn)程退出
pid_t pid = fork();
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid>0)
{
exit(0);
}
else
{
while(1)
{
//2 組長
setsid();
// 改變路徑至根目錄
chdir("/tmp");
//重設(shè)文件掩碼
umask(0);
//關(guān)閉文件描述符
int des=getdtablesize();
int i=0;
for(i=0;i<des;i++)
{
close(i);
}
}
char buf[]="bat xld come!\n";
int fd=open("xld.txt",O_WRONLY|O_CREAT |O_APPEND,0666);
write(fd,buf,sizeof(buf));
sleep(2);
}
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- linux shell實(shí)現(xiàn)守護(hù)進(jìn)程腳本
- php守護(hù)進(jìn)程 加linux命令nohup實(shí)現(xiàn)任務(wù)每秒執(zhí)行一次
- 詳解Linux中的守護(hù)進(jìn)程
- C語言編寫Linux守護(hù)進(jìn)程實(shí)例
- Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法
- Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程
- linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
- Linux守護(hù)進(jìn)程的啟動(dòng)方法
- linux下的守護(hù)進(jìn)程
- linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別
相關(guān)文章
APACHE 配置文件中文版 httpd.conf FOR Apache 2.2.13
APACHE配置文件中文版 httpd.conf FOR Apache 2.2.13 ,綜合網(wǎng)上2.0版本的翻譯,加入自己的理解,補(bǔ)充完善。2009-11-11
詳解linux為阿里云ECS(CentOS7)配置IPv6地址
這篇文章主要介紹了詳解linux為阿里云ECS(CentOS7)配置IPv6地址,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Linux服務(wù)器進(jìn)程退出了,但是顯存占用問題的解決
這篇文章主要介紹了Linux服務(wù)器進(jìn)程退出了,但是顯存占用問題的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
linux下使用Docker和OSS輕松搭建ownCloud專屬網(wǎng)盤(網(wǎng)盤關(guān)閉不用怕)
本文將利用阿里云容器服務(wù)在幾分鐘內(nèi)輕松搭建一個(gè)基于Docker的ownCloud專屬網(wǎng)盤,并使用阿里云提供的OSS(Object Storage Service,對象存儲(chǔ)服務(wù))作為高可靠、低成本的云存儲(chǔ)后端,需要的朋友可以參考下2017-04-04
2018即將推出的Apache Spark 2.4都有哪些新功能
即將發(fā)布的 Apache Spark 2.4 版本是 2.x 系列的第五個(gè)版本。 本文對Apache Spark 2.4 的主要功能和增強(qiáng)功能進(jìn)行了概述,需要的朋友可以參考下2018-09-09

