sigsuspend函式和sigwait函式

2021-06-20 20:45:43 字數 1415 閱讀 3439

#include int sigsuspend(const sigset_t *mask);

sigsuspend函式是等待某個訊號到達,然後呼叫處理函式之後才返回的,否則會處於阻塞等待狀態。unix環境高階程式設計的sleep函式就是通過alarm函式和sigsuspend函式來實現的。

但是當我自己寫了乙個程式的時候,執行緒呼叫unix環境高階程式設計實現的sleep函式竟然老是一睡不醒,除錯發現原來sigsuspend函式不可以用在新建執行緒,而用在控制線程或者程序就行。**如下:

void sig_print(int signo)

void test_suspend()

pthread_t       tid1;

void *

thr_fn1(void *arg)

intmain(void)

執行結果:[root@localhost threads]# ./exitstatus thread 1 returningalarm signo

表明執行緒執行,呼叫test_sigsuspend函式,在該函式裡啟動2s定時,並在sigsuspend函式阻塞。時間到呼叫sigalrm訊號處理函式,但是sigsuspend函式沒有返回(沒有列印sigsuspend return),這樣執行緒就一直堵住不動。

如果把test_sigsuspend函式搬到主線程

int

main(void)

就可以:

[root@localhost threads]# ./exitstatus 

thread 1 returning

alarm signo

sigsuspend return

對於新建執行緒要達到sigsuspend函式的效果,就是使用sigwait函式,**:

#include #include #include pthread_t       tid1, tid2;

sigset_t mask;

void sig_print(int signo)

void test_sigwait()

}void *

thr_fn1(void *arg)

intmain(void)

執行結果:

[root@localhost threads]# ./exitstatus 

thread 1 returning

sigwait return

alarm signo

結論:sigsuspend函式用於執行緒或者主線程,sigwait函式用於新建執行緒。

sigsuspend 函式 解釋

sigsuspend函式作用 如果在等待訊號發生時希望去休眠,則使用sigsuspend函式是非常合適的 標頭檔案 include 乙個保護臨界區 的錯誤例項 sigprocmask 和pause 實現 include include include void handler int sig 訊號處...

sigsuspend 函式作用詳解

看到網上大部分解釋都是抄來抄去的,結果說不清楚,最後還是不理解,於是花了幾個小時研究了下,感覺大體上明白了。希望本文能對你有用處。1 標頭檔案 include 2 乙個保護臨界區 的錯誤例項 sigprocmask 和pause 實現 include include include void han...

PC Lint和SI整合小問題

pc lint和sourceinsight的整合網上可以搜尋到一大堆的文件,但以前同事遇到個問題,在si裡執行pc lint後的結果頁裡,每個item前都會有乙個按鈕可以方便地鏈結到對應的 行。當時同事的所有配置和我的都一樣,但是他的結果頁就是沒有那個按鈕,最好鬱悶半天也沒解決。我這兩天也用pc l...