#include
#include
#include
#include
static void
sig_handler( int signo )
intmain( void )
printf("%d\n", pid );
printf("father\n" );
kill( pid,sigusr1 );
printf("father done\n" );
exit( 0);
}
如果省略1,則輸出中子程序無child done。
新增上則有。
程序間的訊號傳遞要用sigprocmask來阻塞(保留)訊號,不然可能在sigsuspend之前傳遞的訊號就已捕獲,sigsuspend就無法返回。
#include
#include
#include
#include
static void
sig_handler( int signo )
intmain( void )
sleep( 2);
printf("father\n" );
kill( pid,sigusr1 );
sleep( 2);
printf("father done\n" );
exit( 0);
}
雖然用sleep可能不太適合(負載重時可能超過sleep2的時間),但忽略子程序被阻塞等延遲情況。
以上程式的輸出為
child
father
get signal
child done
father done
1、程式執行,因主程序中sleep(2),執行程序切換至子程序
2、子程序輸出child,並掛起,從而執行程序恢復為主程序
3、主程序如sleep(2)執行結束則輸出father,並向子程序傳送訊號,然後子程序sleep(2),執行切換至子程序 4、
一進入子程序即捕獲主程序傳送的訊號,輸出getsignal,並從掛起退出輸出 child done,子程序執行完畢
5、執行切換至主程序,sleep(2)執行結束後,輸出father done,主程序執行結束。
主程序未呼叫kill傳送訊號時,執行子程序過程時沒有獲取到訊號。
主程序在呼叫kill向子程序傳送訊號後,
相對於主程序kill傳送後,執行第一條子程序中的某一語句時,子程序
即獲取到訊號。此時如子程序處在掛起狀態,則退出掛起。
如果主程序的kill執行前,子程序已經進入pause狀態,則在下一次切換到子程序時,子程序捕捉到訊號並退出pause狀態。
如果主程序的kill執行時,子程序還未進入pause狀態,則在下一次切換到子程序時,子程序同樣捕捉到訊號,但是當執行到pause時,子程序便被掛起,如無訊號再次傳入,則無法退出掛起狀態。
如果把上面程式的第乙個sleep(2)去除,則程式可能會發生多種情況:
其中一種:主程序的kill傳送訊號後,切換至子程序時,子程序可能還沒執行到sigsuspend。但此時訊號已**獲,並且sigsuspend沒有能捕捉的訊號,程式無childdone。
所以程序間的訊號傳輸一般用遮蔽字阻塞,這樣只有當執行sigsuspend時,此函式去除相應遮蔽字才能捕捉相應訊號!(函式捕捉到訊號從掛起返回時,恢復遮蔽字原值)
Nsis的自我理解
nsis 指令碼語言的理解 1.nsis 語言的理解 nsis指令碼語言比較獨特,類似於巨集彙編,語法有些像c語言,感覺是純面向過程的東東。功能還算強大,能呼叫windows api,支援用動態鏈結庫形式的擴充套件。能呼叫和建立核心物件。例如可用用createmuteex 用來建立單例項。此處深有體...
AngularJS的自我理解
最近在學angularjs的框架開發,雖說到現在還只學到一半,但是我還是想把從開始到現在對angularjs的思路理解寫下,以便更好的回顧所學的知識。當然 後續的學習我也會在後面完善這一半的結果。以下是我自己最近所學的理解,當然理解走向有誤也希望有讀者能夠指出,菜雞在這裡先謝謝了!angularjs...
this物件的自我理解
函式中的this是存在,就看這個this被繫結到哪個物件了 當乙個函式用作建構函式時 使用new關鍵字 它的this被繫結到正在構造的新物件。建構函式這樣工作 function myconstructor function c var o new c var t new c console.log ...