守護程序是生存期長的一種程序。它們常常在系統引導裝入時啟動,僅在系統關閉時才終止。
守護程序沒有控制終端。因此,說他們是在後台執行的。unix系統有很多守護程序,他們執行日常事務活動。
首先要呼叫umask將檔案模式建立遮蔽字設定為乙個已知值(通常是0),有繼承得來的檔案模式建立遮蔽字可能會被設定為拒絕某些許可權。如果守護程序要建立檔案,那麼他可能要設定特定的許可權。
呼叫fork,然後使父程序exit。這樣做實現了
1.如果守護程序是作為一條簡單的shell命令啟動的,那麼父程序終止會讓shell認為這條命令已經執行完畢。
2.雖然子程序繼承了父程序的程序組id,但獲得了乙個新的程序id,那麼就保證了子程序不是乙個程序組的組長程序。、
3.呼叫setsid建立乙個新回話。我們知道如果呼叫setsid函式的程序不是乙個程序組的組長,則此函式建立乙個新回話。並且:
1)該程序變成新會話的會話首程序,此時,該程序是新會話中的唯一程序
2)該程序成為乙個新程序組的組長程序。新程序組id是該呼叫程序的程序id
3)該程序沒有控制終端,即使呼叫函式之前該程序有乙個控制終端,現在這種關係也被切斷。
4.將當前工作目錄改為根目錄。
5.關閉不再需要的檔案描述符。這是守護程序不再持有從其父程序繼承來的任何檔案描述符。
#include
#include
#include
#include
#include
#include
intmain()
// 設定為新組
pid =
setsid()
;if(pid ==-1
) std::cerr <<
"setsid error"
;// 更新工作空間,一般是乙個不可解除安裝的硬碟位址
ret =
chdir
("/home/andy/code/run");
if(ret ==-1
) std::cerr <<
"chdir error"
;// 檔案許可權
umask
(0022);
// 重定向流,不產生流,避免流溢位
close
(stdin_fileno)
; fd =
open
("/dev/null"
, o_rdwr);if
(fd ==-1
) std::cerr <<
"open error"
;dup2
(fd, stdout_fileno)
;dup2
(fd, stderr_fileno)
;// 具體業務,可以使心跳檢測或者其他什麼的
while
(true
)return0;
}
Linux基礎 建立新程序
好久沒學習了,最近都在忙著上班的事情,過年後這段時間感覺每天都有事情做,忙忙忙,學linux感覺說實話,有點枯燥,比當初學fpga還要枯燥。真的是畢業之後,再去學習的動力就下降很多嗎。但是還是要堅持啊。程式並不能單獨執行,只有將程式載入到記憶體中,系統為他分配資源後才能夠執行,這種執行著的程式稱之為...
Linux程序通訊
linux程序通訊 無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用l...
Linux 程序通訊
程序通訊 通訊 communication 意味著在程序間傳送資料。也把程序間控制資訊的交換稱為低階通訊,而把程序間大批量資料的交換稱為高階通訊。程序通訊的型別 1 共享儲存器系統 記憶體 共享儲存器系統為了傳送大量資料,在儲存器中劃出一塊共享儲存區,諸程序可通過對共享儲存區進行讀資料或寫資料以實現...