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