色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 詳解守護進程的創(chuàng)建與fork兩次分析

詳解守護進程的創(chuàng)建與fork兩次分析 時間:2018-09-27      來源:未知

相信大部分程序員都知道如何去創(chuàng)建一個守護(deamon)進程,但是另一方面,有許多人不知道為什么要這么做,具體為什么這么實現(xiàn)。這里我們就來詳細分析一下創(chuàng)建deamon進程每一步的意義。

本文引用地址://www.17old.cn/emb/Column/7509.html

首先說一下deamon進程的概念,deamon是一種運行在后臺的一種特殊的進程,它獨立于控制終端并且周期性的執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。由于在Linux中,每個系統(tǒng)與用戶進行交流的界面成為終端,每一個從此終端開始運行的進程都會依附于這個終端,這個終端被稱為這些進程的控制終端,當控制終端被關(guān)閉的時候,相應(yīng)的進程都會自動關(guān)閉。但是守護進程卻能突破這種限制,它脫離于終端并且在后臺運行,并且它脫離終端的目的是為了避免進程在運行的過程中的信息在任何終端中顯示并且進程也不會被任何終端所產(chǎn)生的終端信息所打斷。它從被執(zhí)行的時候開始運轉(zhuǎn),直到整個系統(tǒng)關(guān)閉才退出(當然可以人為的殺死相應(yīng)的守護進程)。如果想讓某個進程不因為用戶或中斷或其他變化而影響,那么就必須把這個進程變成一個守護進程。

守護進程的創(chuàng)建步驟:

1、創(chuàng)建子進程,父進程退出。由于守護進程是脫離終端的,因此完成第一步后就會在shell終端里造成一個程序已經(jīng)運行完畢的假象。之后的所有工作在子進程中完成,而用戶在shell終端里則可以執(zhí)行其他命令,從而在形式上做到了與控制終端脫離。實現(xiàn)的語句如下:if(pid=fork()){exit(0);}是父進程就結(jié)束,然后子進程繼續(xù)執(zhí)行。

2、在子進程中創(chuàng)建新的會話(脫離控制終端)。在這里使用的是系統(tǒng)函數(shù)setsid()來創(chuàng)建一個新的會話,并且擔(dān)任該會話組的組長,擺脫原會話的控制==》擺脫原進程的控制==》擺脫原控制終端的控制。

3、改變當前目錄為根目錄。使用fork()創(chuàng)建的子進程是繼承了父進程的當前工作目錄,由于在進程運行中,當前目錄所在的文件系統(tǒng)是不能卸載的,這對以后使用會造成很多的麻煩。因此通常的做法是讓“/”作為守護進程的當前目錄,當然也可以指定其他的別的目錄來作為守護進程的工作目錄。

4、重設(shè)文件權(quán)限掩碼。文件權(quán)限掩碼是屏蔽掉文件權(quán)限中的對應(yīng)位。由于使用fork()函數(shù)新創(chuàng)建的子進程繼承了父進程的文件權(quán)限掩碼,這就給該子進程使用文件帶了很多的麻煩(比如父進程中的文件沒有執(zhí)行文件的權(quán)限,然而在子進程中希望執(zhí)行相應(yīng)的文件這個時候就會出問題)。因此在子進程中要把文件的權(quán)限掩碼設(shè)置成為0,即在此時有大的權(quán)限,這樣可以大大增強該守護進程的靈活性。設(shè)置的方法是:umask(0)。

5、關(guān)閉文件描述符。同文件權(quán)限碼一樣,用fork()函數(shù)新建的子進程會從父進程那里繼承一些已經(jīng)打開了的文件。這些文件被打開的文件可能永遠不會被守護進程讀寫,如果不進行關(guān)閉的話將會浪費系統(tǒng)的資源,造成進程所在的文件系統(tǒng)無法卸下以及引起預(yù)料的錯誤。按照如下方法關(guān)閉它們:

fdtablesize = getdtablesize();

for (fd = 0; fd < fdtablesize; fd++)

close(fd);

我們來看一下代碼:

int main(int argc, const char *argv[])

{

pid_t pid;

pid = fork();

if(pid < 0)

{

perror("fail to fork");

exit(0);

}else if(pid > 0)

{

exit(0);

}else{

setsid();

umask(0);

pid = fork();

if(pid != 0)

{

exit(0);

}

chdir("/");

int maxfd = getdtablesize();

while(maxfd--)

{

close(maxfd);

}

while(1)

{

syslog(LOG_INFO,"im deamon\n");

sleep(1);

}

}

return 0;

}

可以看到上面的代碼里我fork了兩次,雖然說這并不是必須的,但是這的確是對守護進程做出了一些更優(yōu)化的操作。

首先第一次fork:這里第一次fork的作用就是讓shell認為這條命令已經(jīng)終止,不用掛在終端輸入上;再一個是為了后面的setsid服務(wù),因為調(diào)用setsid函數(shù)的進程不能是進程組組長(會報錯Operation not permitted),如果不fork子進程,那么此時的父進程是進程組組長,無法調(diào)用setsid。所以到這里子進程便成為了一個新會話組的組長。

第二次fork:第二次fork是為了避免后期進程誤操作而再次打開終端。因為打開一個控制終端的前提條件是該進程必須為會話組組長,而我們通過第二次fork,確保了第二次fork出來的子進程不會是會話組組長。

上一篇:設(shè)備樹基本語法及屬性分析

下一篇:線性布局中的layout_weight屬性

熱點文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 亚洲精品视频免费在线观看| 国产成人综合精品在线| 国内精品一区二区三区| 国产精品777| 国产视频精品在线| 九九热这里只有在线精品视| 国产成人精品久久| 一区二区日韩精品| 国内精品一区二区三区四区| 亚洲精品www| 欧美夫妻性生活xx| 成人在线视频网| 欧美理论在线观看| 成人做爰www免费看视频网站| 最近的2019中文字幕免费一页 | 91国内免费在线视频| 92国产精品视频| 欧美色欧美亚洲高清在线视频| 91精品国产自产在线老师啪| 久久久av一区| 91九色综合久久| 欧美日韩激情网| 日韩精品在线免费| 88xx成人精品| 国产午夜精品一区二区三区| 欧美在线观看网址综合| 色阁综合伊人av| 成人免费福利视频| 欧美国产视频一区二区| 亚洲女人天堂色在线7777| 日韩av免费在线看| 欧美成人合集magnet| 亚洲第一精品自拍| 欧美一级在线播放| 日韩在线观看精品| 亚洲一区二区中文| 欧美亚洲另类激情另类| 不卡在线观看电视剧完整版| 日韩av综合中文字幕| 国产精品三级在线| 欧美激情免费视频|