守護程序的一些說明

2021-09-12 11:27:47 字數 1606 閱讀 9246

1、實現乙個守護程序的例項如下:

#include "unp.h"

#include #define maxfd 64

extern int daemon_proc;

void daemon_init(const char * pname,int facility){

int i;

pid_t pid;

if((pid = fork())!=0) //呼叫fork,終止父程序,留下子程序繼續執行。

exit(0);

setid(); //建立乙個新的登陸會話session

signal(sighup,sig_ign); //忽略sgihup訊號並在此呼叫fork

if((pid=fork())!=0) //確保將來即使開啟乙個終端裝置,也不會自動獲得控制終端。

exit(0);

daemon_proc = 1; //非零時,出錯處理函式將呼叫syslog函式取代fprintf輸出到標準錯誤輸出

chdir("/");

umask(0);//將工作目錄改到根目錄

for(i=0;i2、實現乙個守護程序最重要的兩步就是:fork子程序,退出父程序;呼叫setsid()函式建立會話。我在乙個練習中就只使用了這兩步,沒有像1中的示例一樣再做其他的操作如更改掩碼、關閉描述符操作等。**如下:

if(fork() > 0) //第1步

exit(0);

setsid(); //第2步

if(fork() > 0)//第3步:確保將來即使開啟乙個終端裝置,也不會自動獲得控制終端。

exit(0);

之所以需要第3步是因為:在svr4中,當沒有控制終端的會話頭程序開啟終端裝置時(這個終端現在不是其他會話的控制終端),該終端自動成為這個會話頭的控制終端。根據這個特點,如果沒有第3步,那麼第一次fork的子程序在呼叫setsid()建立乙個新的會話之後,會成為這個會話組的組長即會話頭,那麼這個子程序就很可能在以後獲得控制終端。加入了第3步之後,在子程序在建立乙個子程序,孫子程序。孫子程序就不是子程序建立的會話的會話頭,因此就不會再獲得終端。

在練習中發現:雖然我加入了2中的**將keymngserver程序變成了守護程序,但是卻發現keymngserver中的printf仍然可以輸出到啟動keymngserver的終端。這可能是因為孫子程序中的檔案描述符是從父程序中複製過來的,因此孫子程序(守護程序)擁有啟動keymngserver的終端的描述符,所以可以輸出到啟動keymngserver的終端。當啟動keymngserver的終端關閉之後,孫子程序(守護程序)還在後台執行,但是就無法再輸出到終端了。

以下是一些結果:

Process的一些用法和守護程序

join 阻塞主程序,等待子程序結束以後,再往下執行 from multiprocessing import process import time def task print 程序 start time.sleep 2 print 程序 end if name main p process ta...

ALV的一些說明

abap alv alv是系統的一種網格的顯示方式,這種方式帶有彙總 排序 篩選等功能,alv格式的資料是以單元格為單位顯示,不象一般的寫屏方式拷出來或是匯出成檔案不同列的內容粘在一塊,這種方式便於資料匯出來放在電子 裡進行加工.slis fieldcat alv中的部分欄位及意義 fieldnam...

string npos的一些說明

string npos的一些說明 static const size t npos 1 表示 size t 的最大值 maximum value for size t 如果對 1表示size t的最大值有疑問可以採用如下 驗證 include include include using namesp...