Linux乙個健壯的訊號介面

2021-06-05 23:29:55 字數 2557 閱讀 2278

linux提供了乙個更見健壯的訊號介面:sigaction。

#include

int sigaction( int sig, const struct sigaction *act , struct sigaction *ocat);

sigaction結構定義在檔案signal.h中,它的作用是定義在接收到引數sig指定的訊號後應該採用的行動。該結構至少應該包含一下

以下幾個成員 。

void (*) (int ) sa_handler /*function, sig_dfl or sig_ign*/

sigset_t sa_mask           /*signals to block in sa_handler*/

int sa_flags                       /* signal action modifiers*/

sigaction函式會在成功時返回0,失敗時返回0.

在引數cat指向的sigaction結構中,sa_handler是乙個函式指標,它指向訊號sig時將被呼叫的訊號處理函式。

sa_mask成員指定了乙個訊號集,在呼叫sa_handler所指向的訊號處理函式之前,該訊號集將被加入到程序的訊號遮蔽字中。

#include #include #include void ouch(int sig)

int main()

}

訊號集標頭檔案signal.h定義了型別sigset_t和用來處理訊號集的函式。sigaction和其他函式將用這些訊號集來修改程序在接收到訊號時的行為。

#includeint sigaddset(sigset_t *set, int signo);

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigdelset(sigset_t *set , int signo);

sigempty將訊號集初始化為空。sigfillset將訊號處理化為包含所以已定義的訊號。sigaddset和sigdelset從訊號集中增加或刪除給定的訊號

(signo)。它們在成功時返回0,失敗時返回-1並設定errno。

函式sigismember判斷乙個給定的訊號是否是乙個訊號集的成員。如果是就返回1,如果不是,它就返回0.給定的訊號無效,它就返回-1並

設定errno為einval。

#include

int sigismember(sigset_t *set , int signo);

程序的訊號遮蔽字的設定或檢查工作由函式sigprocmask來完成。訊號遮蔽字是指當前被阻塞的一組訊號,他們不能被當前程序接收到

#include

int sigprocmask(int how , const sigset_t *set , sigset_t *oset);

sigprocmask函式可以根據引數how指定的方法修改程序的訊號遮蔽字。新的訊號遮蔽字由引數set指定。

引數how的取值可以是表11-6中的乙個。

sig_block                                          把引數set中的訊號新增到訊號遮蔽字中。

sig_setmask                                     把訊號遮蔽字設定為引數set中的訊號。

set_unblock                                  從訊號遮蔽字中刪除引數set中的訊號。

如果乙個訊號被程序阻塞,它就不會傳遞給程序。但它停留在待處理狀態,程式可以通過呼叫函式sigpending來檢視它阻塞的訊號中

有哪些正停留在待處理狀態。

#include

int sigpending(sigset_t *set);

程序可以通過呼叫sigsuspend函式掛起自己的執行,知道訊號集中的乙個訊號到達為止。

#include

int sigsuspend(const sigset_t *sigmask);

這個函式將自己的程序遮蔽字替換為由引數sigmask給出的訊號集,然後掛起程式的執行。

1.sigaction標誌

用在sigaction函式裡的sigaction結構中的sa_flags

sa_nocldstop: 如果sa_nocldstop位被置位並且目標訊號是sigchld,除非子程序退出,而在子程序停止(stop)時父程序將不會收到通知。

sa_nocldwait: sa_nocldwait標誌會阻止子程序成為殭屍程序。在目標訊號是sigchld的時候使用。如果程序設定了這個標誌,接著呼叫某個wait系統呼叫,程序將被阻塞直到子程序全部終止,最後返回-1(譯註:此處在apue2ed中的解釋是返回1),設定errno全域性變數為echild。

sa_onstack: 一些時候需要在特定的堆疊上進行訊號的處理。sigaction系統呼叫提供了這個方式。如果該位被置位,那麼訊號將會被交付到指定的堆疊上。

sa_nodefer: 如果sa_nodefer位被置位,那麼當前訊號正被處理時,系統不會遮蔽該訊號以後的交付。

乙個html介面與另外乙個html介面之間傳遞資料

兩個html介面之間的資料傳遞出了通過後台邏輯進行傳遞之外,如果通過ajax來傳遞的話,一些後台傳遞過來的值不能夠正確的傳遞到前台介面上面去。有一種方法,就是先將後台傳遞進來的資料先放到乙個隱藏的文字框中,然後傳遞給另外乙個介面文字框中的內容,就可以做到兩個頁面直接的資料傳遞。隱藏文字框 ajax請...

乙個簡單的demo認識訊號

include include void signal handler fun int signum intmain int argc,char ar 一 函式宣告 include typedef void sighandler t int sighandler t signal int signu...

關於訊號槽的乙個問題

這又是乙個小白問題。今天在做窗體間傳值時遇到乙個問題 connect返回true,但是槽收不到訊號。經過檢查發現問題 connect的 訊號 物件必須和發射訊號的物件是同乙個。如,在mainwindow的建構函式中 qobject connect pdlgserial,signal changese...