有時候,乙個模組x會被其他模組函式呼叫,模組x會產生很多的實現程序,具有不同的pid號。也許模組x在系統執行時只需要乙個實現程序就可以實現它對系統的服務功能,而執行多個實現程序則會造成對系統資源的浪費,而且在某些情況下,如果模組x是對某個硬體的控制,同時執行多個程序則會導致對硬體資源的搶奪,對硬體的控制從而產生混亂。
dns_hijack模組是需要實現的功能是正確控制inet_led燈的顯示,該模組在使用者不同的上網模式下,通過ping進行檢測soho是否能夠連線到iternet上,如果能夠ping通的話,便通過gpio驅動的操作函式,實現向gpio的輸出暫存器寫入相應的控制訊號,從而實現對internet燈的控制。在某種狀況下,要求inet_led燈間隔0.5s進行閃爍。如果在這種狀況下執行多個dns_hijack程序,則會導致inet_led進行亂閃,而不是你所希望的。因此我們要限制該模組多個程序同時出現執行。
ntpclient是通過向網路中的站點傳送時間戳的資料報從而獲取為系統獲取時間,因此我們只需要在系統啟動執行時啟動該程序模組,為系統獲取標準時間。這個模組他已經實現完成系統執行時對系統的服務功能,之後選擇讓程序進入阻塞狀態。如果我們再一次執行該程序,是沒有必要的。並且可能導致所有程序在完成功能之後都進入了阻塞狀態,程序並沒有退出釋放資源,從而造成系統資源的消耗。
那我們如何來限制只產生乙個程序了?一種方法是在在執行該模組時,檢測在檔案「/var/run/***x.pid」中是否存在,如果存在則推出該程序,若不存在則建立該檔案,並將程序的pid號寫入該檔案,作為標誌該模組已經有乙個程序在執行。
fprintf(fstr,"%d /n",getpid());
然後才執行該模組的功能。當該程序退出時要確保檔案「/var/run/***x.pid」被刪除,否則可能當該程序被終止後,當該模組被再次啟動的時候,檢測該程序檔案已經存在,從而退出該程序,系統無法再啟動該程序實現系統想要實現的功能。
導致乙個程被終止的原因有很多
1 . 程序在完成其功能後,正常退出,一般是return 0
2 . 接收到終止的訊號,有sigint(ctrl+c),sigquit(ctrl+/),sigkill,sigterm....其中sigkill是對於一般使用者程序是不可 捕捉,不可忽略的
3 . 執行時產生異常錯誤,導致程序終止退出,一般是 exit( 0)。
因此我們要對上述各種原因導致程序的退出,在程序退出之前,實現對檔案「/var/run/***x.pid」的刪除。
對於終止程序的訊號,我們可以採用sigal(int,void(*func)(int )) 來捕獲程序終止訊號,並且在 func 中實現程序推出之前的善後工作 : 刪除此程序的標誌檔案 。
對於return,exit,我們可以通過atexit(void (*func )(void))將「善後處理」函式 func 進行註冊,在程序被終止的時候,func 將被呼叫。我們可以通過atexit()註冊多個「善後處理」函式,程序終止時將以先註冊,後呼叫的棧操作順序進行處理。
一 程序執行緒
1.程序的3種狀態 執行 阻塞 就緒 其中不存在的狀態轉換 阻塞 執行 就緒 阻塞 2.作業系統用於維護程序記錄的結構 程序表或程序控制權 pcb 3.程式使用cpu的3種方式 cpu導向 io導向 平衡型程式 4.程序排程目標 極小化平均時間 級大化系統吞吐量 保持系統各個功能部分均處於繁忙狀態和...
一 程序管理
1基本概念 程序 計算機已執行程式的實體。程式本身只是指令的集合,程序才是程式的真正執行。使用者下達執行程式的命令後,就會產生程序。程序通常有5種狀態,其中前3種為程序的基本狀態。分別為 執行狀態 就緒狀態 阻塞狀態 建立狀態 結束狀態。其中,就緒狀態指程序獲得了除了處理器之外的一切所需資源,一旦得...
使用Mutex來保證單一程序例項的一種方法
使用mutex來保證單一程序例項的一種方法 我們很多時候需要保證軟體只有乙個例項在執行,這裡記錄一種使用mutex來保證單一程序例項的方法。1.首先定義乙個全域性的mutex的名稱 define mutex name t global single mutex 注意,這裡的名稱指定了是global全...