sigprocmask()函数实例详解,设置信号规定时间堵塞,取消信号堵塞
功能描述:設定對信號屏蔽集內的信號的處理方式(阻塞或不阻塞)。
用法:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
參數:
how:用于指定信號修改的方式,可能選擇有三種:
SIG_BLOCK //加入信號到進程屏蔽。
SIG_UNBLOCK //從進程屏蔽里將信號刪除。
SIG_SETMASK //將set的值設定為新的進程屏蔽。
set:為指向信號集的指針,在此專指新設的信號集,如果僅想讀取現在的屏蔽值,可將其置為NULL。
oldset:也是指向信號集的指針,在此存放原來的信號集。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為EINVAL。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void handler(int sig)
{
? ? printf("Deal SIGINT");??//SIGINT信號處理函數
}
?
int main()
{
? ? sigset_t newmask;
? ? sigset_t oldmask;
? ? sigset_t pendmask;
? ? struct sigaction act;
? ? act.sa_handler = handler;??//handler為信號處理函數首地址
? ? sigemptyset(&act.sa_mask);
? ? act.sa_flags = 0;
? ? sigaction(SIGINT, &act, 0);??//信號捕捉函數,捕捉Ctrl+C
? ? sigemptyset(&newmask);//初始化信號量集
? ? sigaddset(&newmask, SIGINT);//將SIGINT添加到信號量集中
? ? sigprocmask(SIG_BLOCK, &newmask, &oldmask);//將newmask中的SIGINT阻塞掉,并保存當前信號屏蔽字到Oldmask
? ? sleep (5);//休眠5秒鐘,說明:在5s休眠期間,任何SIGINT信號都會被阻塞,如果在5s內收到任何鍵盤的Ctrl+C信號,則此時會把這些信息存在內核的隊列中,等待5s結束后,可能要處理此信號。?
? ? sigpending(&pendmask);//檢查信號是懸而未決的,
? ? if (sigismember(&pendmask, SIGINT))//SIGINT是懸而未決的。所謂懸而未決,是指SIGINT被阻塞還沒有被處理
? ? {
? ? ? ? printf("/nSIGINT pending/n");
? ? }
? ? sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢復被屏蔽的信號SIGINT
?
? ? ?//此處開始處理信號,調用信號處理函數
? ? printf("SIGINT unblocked/n");
? ? return (0);
}
注意:上面還有一種方式:
sigprocmask(SIG_BLOCK, &newmask, NULL); //阻塞
sigprocmask(SIG_UNBLOCK, &newmask, NULL);//取消阻塞
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的sigprocmask()函数实例详解,设置信号规定时间堵塞,取消信号堵塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 线程实例一(查看线程是否存活、
- 下一篇: gevent开发http服务器与tcp服