導航:首頁 > 操作系統 > linuxsigchld

linuxsigchld

發布時間:2023-06-05 05:57:34

1. 如何以守護進程在linux系統下執行

編寫守護進程程序的要點:
(1)讓程序在後台執行。方法是調用fork()產生一個子進程,然後使父進程退出。
(2)調用setsid()創建一個新對話期。控制終端、登錄會話和進程組通常是從父進程繼承下來的,守護進程要擺脫它們,不受它們的影響,方法是調用setsid()使進程成為一個會話組長。setsid()調用成功後,進程成為新的會話組長和進程組長,並與原來的登錄會話、進程組和控制終端脫離。
(3)禁止進程重新打開控制終端。經過以上步驟,進程已經成為一個無終端的會話組長,但是它可以重新申請打開一個終端。為了避免這種情況發生,可以通過使進程不再是會話組長來實現。再一次通過fork()創建新的子進程,使調用fork的進程退出。
(4)關閉不再需要的文件描述符。子進程從父進程繼承打開的文件描述符。如不關閉,將會浪費系統資源,造成進程所在的文件系統無法卸下以及引起無法預料的錯誤。首先獲得最高文件描述符值,然後用一個循環程序,關閉0到最高文件描述符值的所有文件描述符。
(5)將當前目錄更改為根目錄。
(6)子進程從父進程繼承的文件創建屏蔽字可能會拒絕某些許可權。為防止這一點,使用unmask(0)將屏蔽字清零。
(7)處理SIGCHLD信號。對於伺服器進程,在請求到來時往往生成子進程處理請求。如果父進程不等待子進程結束,子進程將成為僵屍進程(zombie),從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器進程的並發性能。在Linux下可以簡單地將SIGCHLD信號的操作設為SIG_IGN。這樣,子進程結束時不會產生僵屍進程。

2. linux下如何用c語言調用shell命令

在c語言中調用shell命令的方法實現。
c程序調用shell腳本共有兩種方法
:system()、popen(),分別如下:
system()
不用自己去創建進程,系統已經封裝了這一步,直接加入自己的命令即可
popen()
也可以實現執行的命令,比system
開銷小
以下分別說明:
1)system(shell命令或shell腳本路徑);
system()
會調用fork()產生
子歷程,由子歷程來調用/bin/sh-c
string來履行
參數string字元串所代表的命令,此命令履行
完後隨即返回原調用的歷程。在調用system()期間sigchld
信號會被暫時擱置,sigint和sigquit
信號則會被漠視


回值:如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(null),則返回非零值。
如果
system()調用成功
則最後會返回履行
shell命令後的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因
此最好能再反省
errno
來確認履行
成功

system命令以其簡略
高效的作用得到很很廣泛
的利用
,下面是一個例子
例:在/tmp/testdir/目錄下有shell腳本tsh.sh,內容為
#!/bin/sh
wget
$1
echo
"done!"
2)popen(char
*command,char
*type)
popen()
會調用fork()產生
子歷程,然後從子歷程中調用/bin/sh
-c來履行
參數command的指令。參數type可應用
「r」代表讀取,「w」代表寫入。遵循此type值,popen()會建立
管道連到子歷程的標准
輸出設備
或標准
輸入設備
,然後返回一個文件指針。隨後歷程便可利用
此文件指針來讀取子歷程的輸出設備
或是寫入到子歷程的標准
輸入設備
中。此外,所有應用

件指針(file*)操作的函數也都可以應用
,除了fclose()以外。
返回值:若成功
則返迴文件指針,否則返回null,差錯
原因存於errno中。注意:在編寫具suid/sgid許可權的程序時請盡量避免應用
popen(),popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
例:c程序popentest.c內容如下:
#include
main
{
file
*
fp;
charbuffer[80];
fp=popen(「~/myprogram/test.sh」,」r」);
fgets(buffer,sizeof(buffer),fp);
printf(「%s」,buffer);
pclose(fp);
}

3. 如何正確編寫linux守護進程

1、守護進程,也就是通常說的Daemon進程,是Linux中的後台服務進程。它是一個生存期較長的進程,通常獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。如果想讓某個進程不因為用戶或終端或其他地變化而受到影響,那麼就必須把這個進程變成一個守護進程。
2、創建守護進程步驟
1)創建子進程,父進程退出
之後的所有工作都在子進程中完成,而用戶在Shell終端里則可以執行其他命令,從而在形式上做到了與控制終端的脫離。
在Linux中父進程先於子進程退出會造成子進程成為孤兒進程,而每當系統發現一個孤兒進程時,就會自動由1號進程(init)收養它,這樣,原先的子進程就會變成init進程的子進程。
2)在子進程中創建新會話
進程組:是一個或多個進程的集合。進程組有進程組ID來唯一標識。除了進程號(PID)之外,進程組ID也是一個進程的必備屬性。每個進程組都有一個組長進程,其組長進程的進程號等於進程組ID。且該進程組ID不會因組長進程的退出而受到影響。
會話周期:會話期是一個或多個進程組的集合。通常,一個會話開始於用戶登錄,終止於用戶退出,在此期間該用戶運行的所有進程都屬於這個會話期。
(1)pid_t setsid(void);
setsid() creates a new session if the calling process is not a process group leader. The calling process will be the only process in this new process group and in this new session.
setsid函數用於創建一個新的會話,並擔任該會話組的組長。調用setsid有下面的3個作用:
① 讓進程擺脫原會話的控制
② 讓進程擺脫原進程組的控制
③ 讓進程擺脫原控制終端的控制
有以下三個結果:
(a)成為新會話的首進程
(b)成為一個新進程組的組長進程
(c)沒有控制終端。
有些人建議在此時再次調用fork,並使父進程終止。第二個子進程作為守護進程繼續運行。這樣就保證了該守護進程不是會話首進程。
setsid函數能夠使進程完全獨立出來,從而擺脫其他進程的控制。
setsid()調用成功後,進程成為新的會話組長和新的進程組長,並與原來的登錄會話和進程組脫離。由於會話過程對控制終端的獨占性,進程同時與控制終端脫離。 子進程可以自己組成一個新的進程組,即調用setpgrp()與原進程組脫離關系,產生一個新的進程組,進程組號與它的進程號相同.這樣,父進程退出運行後就不會影響子進程的當前運行.
3)改變當前目錄為根目錄
使用fork創建的子進程繼承了父進程的當前工作目錄;進程活動時,其工作目錄所在的文件系統不能卸下。通常的做法是讓"/"作為守護進程的當前工作目錄,也可以是其他目錄,如/tmp,使用chdir。
4)重設文件許可權掩碼
文件許可權掩碼是指屏蔽掉文件許可權中的對應位。比如,有個文件許可權掩碼是050,它就屏蔽了文件組擁有者的可讀與可執行許可權。mask = mask & ~050
通常,把文件許可權掩碼設置為0,umask(0)。
5)關閉文件描述符
用fork函數新建的子進程會從父進程那裡繼承已經打開了的文件描述符。這些被打開的文件可能永遠不會被守護進程讀寫,但它們一樣消耗系統資源,而且可能導致所在的文件系統無法卸下。
在上面的第二步之後,守護進程已經與所屬的控制終端失去了聯系。因此從終端輸入的字元不可能達到守護進程,守護進程中用常規方法(如printf)輸出的字元也不可能在終端上顯示出來。所以,文件描述符為0、1和2 的3個文件(常說的輸入、輸出和報錯)已經失去了存在的價值,也應被關閉。
for(i=0;i<MAXFILE;i++)
close(i);
6)守護進程退出處理
當用戶需要外部停止守護進程運行時,往往會使用 kill命令停止該守護進程。所以,守護進程中需要編碼來實現kill發出的signal信號處理,達到進程的正常退出。
signal(SIGTERM, sigterm_handler);
void sigterm_handler(int arg)
{
_running = 0;
}
7)處理SIGCHLD信號
處理SIGCHLD信號並不是必須的。但對於某些進程,特別是伺服器進程往往在請求到來時生成子進程處理請求。如果父進程不等待子進程結束,子進程將成為僵屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器進程的並發性能。在Linux下可以簡單地將 SIGCHLD信號的操作設為SIG_IGN。
signal(SIGCHLD,SIG_IGN);
這樣,內核在子進程結束時不會產生僵屍進程。

4. Linux終止前台進程的命令

1、首先,連接相應linux主機,進入到linux命令行狀態下,等待輸入shell指令。

5. linux signal 11 是什麼意思

通過kill -l 可以查看信號列表,11 是段錯誤
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX

閱讀全文

與linuxsigchld相關的資料

熱點內容
呼吸燈單片機程序 瀏覽:950
linux域socket 瀏覽:245
qq分身怎麼樣才能加密 瀏覽:453
windows打開linux 瀏覽:995
新建文件夾為什麼不能發送微信 瀏覽:600
交警app怎麼綁定本人幾輛車 瀏覽:985
彩虹六號如何人工伺服器 瀏覽:632
mc伺服器地址怎麼登入 瀏覽:556
蘋果app怎麼掃描二維碼下載 瀏覽:959
css文件在線解壓 瀏覽:156
36歲程序員近況 瀏覽:284
哪裡可以下載不加密的歌 瀏覽:935
隱藏文件夾是什麼梗 瀏覽:919
插件注冊命令 瀏覽:497
梁一端加密一端不加密規范 瀏覽:82
代碼行數統計命令 瀏覽:104
單片機中2K表示什麼 瀏覽:483
紫禁城為什麼會斷開伺服器 瀏覽:580
華為手機的方舟編譯器在哪呢 瀏覽:125
下載壓縮虐殺原形2 瀏覽:907