日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sigprocmask()函数实例详解,设置信号规定时间堵塞,取消信号堵塞

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()函数实例详解,设置信号规定时间堵塞,取消信号堵塞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。