訊號的自我理解(不知對錯)

2021-06-21 21:15:02 字數 1713 閱讀 9011

#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 ...