有關Linux下父子程序之間的幾個思考與結論

2021-05-22 22:27:41 字數 1329 閱讀 1253

. 父程序可以利用wait()/ waitpid()等待子程序的結束,避免僵死子程序的產生,當然也可以迴圈的wait()/ watipid()來等待所有的子程序的結束;最好可以用法是,在子程序結束時,會向父程序傳送的sigchld訊號,父程序通過 signal()/sigaction()來響應子程序的結束.具體例項可參考:testfork4.c,關鍵**如下:

signal(sigchld, sigchld_handler);

void sigchld_handler(int sig)

//while((pid =waitpid(-1, &status, wnohang))>0){}

return;

}2 . 當父程序結束時,還未結束的子程序就會成為孤兒程序,系統會把init程序作為其父程序;從而使得子程序在父程序結束後,繼續執行.

3 . 對於父子程序共存時,產生相關訊號如sigint時,父子程序都能接受到此訊號,只是先由父程序響應,再由父程序把此訊號傳遞給子程序;但要注意的地方是:(1)如父程序沒有對該訊號程序自定義處理,則父子程序都接受訊號的預設處理,eg:在沒有對sigint程序自定義處理時,產生此訊號,由父子程序都馬上中止;(2)如父程序自定義了訊號處理方法,則子程序一樣接受此訊號和其訊號處理方法;此時,若子程序成為孤兒程序,則此時的子程序不會再接受此訊號和其訊號處理方法.具體例項可參考 testfork6.c,關鍵**如下:

signal(sigint, sig_handler);

for(i =0; i<5; i++)

}4 . 在建立子程序時,核心將父程序的很多內容拷貝給子程序,同時在呼叫fork()後,父子程序共享正文部分(其實也相當於拷貝);注意拷貝兩字,所以子程序中修改的東東對父程序沒有作用,除非利用父子程序通訊方法;因此,要特別注意子程序的**編寫,如動態空間的釋放問題,記憶體訊號修改問題;具體例項可參考:testfork1.c,關鍵**如下:

gets(buf);

pid =fork();

if(pid ==0)

else

printf("%s/n", buf);//此處輸出結果處決於該語句位於哪個程序(父/子程序)

結果:(hello 為gets(buf)語句)

hello

child:xiaofeng

parent:hello

5 . 補充下有關訊號的幾個結論:

(1)訊號處理有三種模式,一為預設處理方式;二為訊號忽略方式;三為自定義訊號處理方法;

(2) 當乙個程序睡眠在可中斷優先順序時,程序捕獲的訊號將中斷程序的睡眠

有關Linux下父子程序內容

1 父程序可以利用wait waitpid 等待子程序的結束,避免僵死子程序的產生,當然也可以迴圈的wait watipid 來等待所有的子程序的結束 最好可以用法是,在子程序結束時,會向父程序傳送的sigchld訊號,父程序通過 signal sigaction 來響應子程序的結束.具體例項可參考...

Linux中父子程序之間的通訊

在linux系統中實現父子程序的通訊可以採用pipe 和fork 函式進行實現。利用兩個管道在父子程序之間進行通訊如 1 include2 include3 include4 include5 include 6int main void 23 24 pid fork 25if 1 pid 此處為了...

Linux 基於fork 函式父子程序之間的通訊

寫乙個程式,包含兩個程序,在子程序輸入參與計算的資料a b的值,在父程序中計算a b的值並輸出計算結果 要求輸出子程序和父程序的程序id.源程式 include include include include include include intmain void pid fork if pid ...