2014-11-05 75 views
0

所以我目前正在研究POSIX線程和信號C.編程 我的講師使用C信號。 signal()vs sigset()?

sigset(int sigNumber, void* signalHandlerFUnction) 

因爲他的筆記是不是世界上最好的,我不得不做一些研究,我自己來到一篇很好的文章解釋了信號,但作者正在使用signal()方法,它接受相同類型的參數,sigNumber和一個指向信號處理函數的指針。

從我可以看到兩種方法接受相同的參數,基本上產生相同的結果。 我讀的信號()是舊的,不便攜式,所以sigaction()更好。但是,實際的區別是什麼?

+2

請仔細閱讀[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html)。事實上,[sigaction(2)](http://man7.org/linux/man-pages/man2/sigaction.2.html)更可取。 – 2014-11-05 17:20:53

+1

谷歌搜索在http://compgroups.net/comp.unix.programmer/difference-bet-sigset-sigaction-and-sign/313151上產生了這個答案,並且有很多參考資料可以跟進。準備做一個學生自己的研究,而不是把所有東西都交給一個盤子。 – 2014-11-05 17:22:49

+4

['sigset()'](http://pubs.opengroup。org/onlinepubs/9699919799/functions/sigset.html)系列功能被POSIX標記爲過時。你應該使用['sigaction()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html),原因很多,至少在[ sigaction()'和'signal()'](http://stackoverflow.com/questions/231912/what-is-the-difference-between-sigaction-and-signal/232711#232711) – 2014-11-05 17:24:35

回答

4

功能signalsigset(及其家屬)使用的Unix操作系統,以及sigaction全部建立或刪除信號處理。

signal是ISO C規定的這些函數中唯一的一個,因此它是最便攜的,但它也是最受限制的,其行爲的關鍵方面是未知的(例如它是否建立中斷阻塞的信號系統調用)。

sigset系列是POSIX的一部分,但現在已經過時了。這些功能從來沒有可靠地跨平臺使用,並沒有解決所有與signal不符的問題。不要使用它們。

sigaction位於POSIX.1中,提供比任何其他選項更多的功能,並且其行爲已詳細說明,包括所有的情況。應儘可能使用它。由於它不在ISO C中,而是在POSIX.1-2001中,所以對於第一次訂購,您可以在除Windows以外的任何地方使用它。但是,信號處理程序不應該在Windows上的上使用,因爲它們不是系統原語,並且不能可靠地工作;這是我的理解,應該使用structured exception handlingasynchronous procedure calls來代替,具體取決於要做什麼。

您的講師專門教授POSIX系統編程,所以他們應該更新他們的示例代碼和講座,僅指sigaction。他們確實應該覆蓋sigprocmask,sigtimedwaitpselect

1

信號用於安裝信號處理程序或忽略信號。 sigaction是一個Posix函數,可以忽略信號或安裝信號處理程序。 sigaction需要一個信號掩碼,以便它可以對多個信號進行操作,而信號旨在爲一個信號安裝信號處理程序。

看到這個以前的帖子: What is the difference between sigaction and signal?

sigset是基於系統V