IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


信號處理函數(shù)signal()和信號集函數(shù)組

分享到:
           

    本文關(guān)鍵字: 信號處理函數(shù),signal(),信號集函數(shù)組

    信號處理的方法主要有兩種,一種是使用signal()函數(shù),另一種是使用信號集函數(shù)組。下面分別介紹這兩種處理方式。

    1)使用signal()函數(shù)

    使用signal()函數(shù)處理時(shí),只需指出要處理的信號和處理函數(shù)即可。它主要用于前32種非實(shí)時(shí)信號的處理,不支持信號傳遞信息,但是由于使用簡單、易于理解,因此也受到很多程序員的歡迎。Linux還支持一個(gè)更健壯更新的信號處理函數(shù)sigaction(),推薦使用該函數(shù)。

    signal()函數(shù)的語法要點(diǎn)如表1所示。

表1 signal()函數(shù)語法要點(diǎn)

所需頭文件 #include <signal.h>
函數(shù)原型 typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函數(shù)傳入值 signum:指定信號代碼
handler SIG_IGN:忽略該信號
SIG_DFL:采用系統(tǒng)默認(rèn)方式處理信號
自定義的信號處理函數(shù)指針
函數(shù)返回值 成功:以前的信號處理配置
出錯(cuò):-1

    這里需要對該函數(shù)原型進(jìn)行說明。這個(gè)函數(shù)原型有點(diǎn)復(fù)雜:首先該函數(shù)原型整體指向一個(gè)無返回值并且?guī)б粋(gè)整型參數(shù)的函數(shù)指針,也就是信號的原始配置函數(shù);接著該原型又帶有兩個(gè)參數(shù),其中第2個(gè)參數(shù)可以是用戶自定義的信號處理函數(shù)的函數(shù)指針。

    表2列舉了sigaction()函數(shù)的語法要點(diǎn)。

表2 sigaction()函數(shù)語法要點(diǎn)

所需頭文件 #include <signal.h>
函數(shù)原型 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
函數(shù)傳入值 signum:信號代碼,可以為除SIGKILL及SIGSTOP外的任何一個(gè)特定有效的信號
act:指向結(jié)構(gòu)sigaction的一個(gè)實(shí)例的指針,指定對特定信號的處理
oldact:保存原來對相應(yīng)信號的處理
函數(shù)返回值 成功:0
出錯(cuò):-1

    這里要說明的是sigaction()函數(shù)中第2和第3個(gè)參數(shù)用到的sigaction結(jié)構(gòu),這是一個(gè)看似非常復(fù)雜的結(jié)構(gòu),希望讀者能夠慢慢閱讀此段內(nèi)容。

    首先給出了sigaction的定義,代碼如下:

    struct sigaction
    {
        void (*sa_handler)(int signo);
        sigset_t sa_mask;
        int sa_flags;
        void (*sa_restore)(void);
    }

    sa_handler是一個(gè)函數(shù)指針,指定信號處理函數(shù),這里除可以是用戶自定義的處理函數(shù)外,還可以為SIG_DFL(采用默認(rèn)的處理方式)或SIG_IGN(忽略信號)。它的處理函數(shù)只有一個(gè)參數(shù),即信號值。

    sa_mask是一個(gè)信號集,它可以指定在信號處理程序執(zhí)行過程中哪些信號應(yīng)當(dāng)被屏蔽,在調(diào)用信號捕獲函數(shù)前,該信號集要加入到信號的信號屏蔽字中。

    sa_flags中包含了許多標(biāo)志位,是對信號進(jìn)行處理的各個(gè)選擇項(xiàng)。它的常見可選值如表3所示。

表3 常見信號的含義及其默認(rèn)操作

信 號 含 義
SA_NODEFER / SA_NOMASK 當(dāng)捕捉到此信號時(shí),在執(zhí)行其信號捕捉函數(shù)時(shí),系統(tǒng)不會(huì)自動(dòng)屏蔽此信號
SA_NOCLDSTOP 進(jìn)程忽略子進(jìn)程產(chǎn)生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信號
SA_RESTART 令重啟的系統(tǒng)調(diào)用起作用
SA_ONESHOT / SA_RESETHAND 自定義信號只執(zhí)行一次,在執(zhí)行完畢后恢復(fù)信號的系統(tǒng)默認(rèn)動(dòng)作

    以下實(shí)例表明了如何使用signal()函數(shù)捕捉相應(yīng)信號,并做出給定的處理。這里,my_func就是信號處理的函數(shù)指針,讀者還可以將其改為SIG_IGN或SIG_DFL查看運(yùn)行結(jié)果。第2個(gè)實(shí)例是用sigaction()函數(shù)實(shí)現(xiàn)同樣的功能。

    以下是使用signal()函數(shù)的示例:

    /* signal.c */
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>

    /* 自定義信號處理函數(shù) */
    void my_func(int sign_no)
    {
        if (sign_no == SIGINT)
        {
            printf("I have get SIGINT\n");
        }
        else if (sign_no == SIGQUIT)
        {
            printf("I have get SIGQUIT\n");
        }
    }

    int main()
    {
        printf("Waiting for signal SIGINT or SIGQUIT...\n");

        /* 發(fā)出相應(yīng)的信號,并跳轉(zhuǎn)到信號處理函數(shù)處 */
        signal(SIGINT, my_func);
        signal(SIGQUIT, my_func);
        pause();
        exit(0);
    }

    運(yùn)行結(jié)果如下:

    $ ./signal
    Waiting for signal SIGINT or SIGQUIT...
    I have get SIGINT (按Ctrl+c 組合鍵)
    $ ./signal
    Waiting for signal SIGINT or SIGQUIT...
    I have get SIGQUIT (按Ctrl+\ 組合鍵)

    以下是用sigaction()函數(shù)實(shí)現(xiàn)同樣的功能,只列出了更新的main()函數(shù)部分。

    /* sigaction.c */
    /* 前部分省略 */
    int main()
    {
        struct sigaction action;
        printf("Waiting for signal SIGINT or SIGQUIT...\n");

        /* sigaction結(jié)構(gòu)初始化 */
        action.sa_handler = my_func;
        sigemptyset(&action.sa_mask);
        action.sa_flags = 0;

        /* 發(fā)出相應(yīng)的信號,并跳轉(zhuǎn)到信號處理函數(shù)處 */
        sigaction(SIGINT, &action, 0);
        sigaction(SIGQUIT, &action, 0);
        pause();
        exit(0);
    }

    2)信號集函數(shù)組

    使用信號集函數(shù)組處理信號時(shí)涉及一系列的函數(shù),這些函數(shù)按照調(diào)用的先后次序可分為以下幾大功能模塊:創(chuàng)建信號集、注冊信號處理函數(shù)及檢測信號。

    其中,創(chuàng)建信號集主要用于處理用戶感興趣的一些信號,其函數(shù)包括以下幾個(gè)。

    ● sigemptyset():將信號集初始化為空。

    ● sigfillset():將信號集初始化為包含所有已定義的信號集。

    ● sigaddset():將指定信號加入到信號集中。

    ● sigdelset():將指定信號從信號集中刪除。

    ● sigismember():查詢指定信號是否在信號集中。

    注冊信號處理函數(shù)主要用于決定進(jìn)程如何處理信號。這里要注意的是,信號集里的信號并不是真正可以處理的信號,只有當(dāng)信號的狀態(tài)處于非阻塞狀態(tài)時(shí)才會(huì)真正起作用。因此,首先使用sigprocmask()函數(shù)檢測并更改信號屏蔽字(信號屏蔽字是用來指定當(dāng)前被阻塞的一組信號,它們不會(huì)被進(jìn)程接收),然后使用sigaction()函數(shù)來定義進(jìn)程接收到特定信號后的行為。

    檢測信號是信號處理的后續(xù)步驟,因?yàn)楸蛔枞男盘柌粫?huì)傳遞給進(jìn)程,所以這些信號就處于“未處理”狀態(tài)(也就是進(jìn)程不清楚它的存在)。sigpending()函數(shù)允許進(jìn)程檢測“未處理”信號,并進(jìn)一步?jīng)Q定對它們做何處理。

    首先介紹創(chuàng)建信號集的函數(shù)格式,表4列舉了這一組函數(shù)的語法要點(diǎn)。

表4 創(chuàng)建信號集函數(shù)語法要點(diǎn)

所需頭文件 #include <signal.h>
函數(shù)原型 int sigemptyset(sigset_t *set)
int sigfillset(sigset_t *set)
int sigaddset(sigset_t *set, int signum)
int sigdelset(sigset_t *set, int signum)
int sigismember(sigset_t *set, int signum)
函數(shù)傳入值 set:信號集
signum:指定信號代碼
函數(shù)返回值 成功:0(sigismember成功返回1,失敗返回0)
出錯(cuò):-1

    表5列舉了sigprocmask()函數(shù)的語法要點(diǎn)。

表5 sigprocmask()函數(shù)語法要點(diǎn)

所需頭文件 #include <signal.h>
函數(shù)原型 int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
函數(shù)傳入值 how:決定函數(shù)的操作方式 SIG_BLOCK:增加一個(gè)信號集到當(dāng)前進(jìn)程的阻塞集中
SIG_UNBLOCK:從當(dāng)前的阻塞集中刪除一個(gè)信號集
SIG_SETMASK:將當(dāng)前的信號集設(shè)置為信號阻塞集
set:指定信號集
oset:信號屏蔽字
函數(shù)返回值 成功:0
出錯(cuò):-1

    此處,若set是一個(gè)非空指針,則參數(shù)how表示函數(shù)的操作方式;若how為空,則表示忽略此操作。

    表6列舉了sigpending()函數(shù)的語法要點(diǎn)。

表6 sigpending()函數(shù)語法要點(diǎn)

所需頭文件 #include <signal.h>
函數(shù)原型 int sigpending(sigset_t *set)
函數(shù)傳入值 set:要檢測的信號集
函數(shù)返回值 成功:0
出錯(cuò):-1

    總之,在處理信號時(shí),一般遵循如圖1所示的操作流程。


圖1 一般的信號操作處理流程

    本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》

   熱點(diǎn)鏈接:

   1、信號捕捉函數(shù)alarm()和pause()
   2、信號發(fā)送函數(shù)kill()和raise()
   3、Linux下的信號機(jī)制
   4、有名管道(FIFO)
   5、標(biāo)準(zhǔn)流管道

更多新聞>> 

主站蜘蛛池模板: 江门摩托车配件|江门电动车配件|江门市盛泰嘉金属塑料制品有限公司 | 深圳货柜租赁_集装箱出售/租赁_集装箱改造_鹏泰集装箱 | 行星式球磨机-实验室球磨仪[东方天净]小型高能研磨筛分仪直销厂家 | 收银系统_收银机_pos收款机_门店管理系统-客如云 | 拉丝机_拔丝机_拉丝设备_丝网机械 - 安平县泰煌拉丝机厂家 | 箱式电炉,箱式烧结炉,箱式马弗炉,箱式实验炉,高温箱式电阻炉,箱式加热炉,箱式退火炉,箱式真空气氛炉洛阳研博炉业有限公司 | 模具架,模具货架,抽屉式模具架-模具架厂家 | 射频导纳物位开关|雷达液位计|安全光栅光幕传感器|音叉料位开关|两级跑偏开关|双向拉绳开关|纵向撕裂保护装置-山东卓信机械有限公司 | 淄博润裕机械设备有限公司-搅拌器,搅拌桨叶,反应釜,机械密封,化工搅拌 | 木工圆锯片,进口锯片厂家,合金锯片生产厂家,木工合金锯片,BAK(百恪)刀具有限公司 | 老照片修复,修复老照片,老旧照片翻新-老照片修复网 | 装备升级改造I成都星迅通科技有限公司-成都星迅通科技有限公司官方网站 | 泰安德兴元机械设备有限公司|网站首页| 济南德固机械|膨化食品生产线|早餐谷物玉米片生产线|拉丝蛋白生产线|速食米饭生产线 | 精品中文字幕在线观看,粉嫩av一区二区三区,最近中文字幕在线看免费视频,亚洲高清在线观看,日本一区二区视频手机免费看,国产黄色小视频,亚洲高清免费视频,国产精品一区二区欧美视频,亚洲人免费视频,亚洲视频在线观看免费,国产免费高清综合视频,中文字幕永久在线 | 网络公关公司_舆情监测_危机公关_品牌公关_一夜红传媒 | 郑州空调维修_郑州中央空调维修_空调清洗维保-郑州大晟机电设备安装工程有限公司 | 柔性电缆-专业机器人电缆,拖链电缆生产厂家 | 中国焊接协会网站—中国焊接信息网;焊接行业最权威访问量最大的专业网站:焊接信息、焊接材料,焊接机器,焊接设备,焊机,焊材,辅助设备,焊机配件,仪器仪表,电动工具,钎焊,送丝机,表面处理,自动化专机,焊锡丝,助焊剂 | 易众拍卖行-事故车拍卖,残值车拍卖,水淹车拍卖,全损车拍卖,修复车拍卖,碰橦车拍卖,瑕疵车拍卖,报废车拍卖,泡水车拍卖,拆车件拍卖,配件拍卖,火烧车拍卖,二手车拍卖专业线上平台 | 烟台真空包装,烟台木包装,烟台熏蒸木箱-烟台福岭木制品有限公司 烟台通风管道,烟台风机风管,烟台风阀-烟台福莱通风设备有限公司 | 金亨木业建筑模板_清水模板_覆膜板_金亨木业建筑模板厂家批发 | 酸碱废气中和塔-酸雾废气吸收塔-酸雾废气处理塔|首页-广州市佰镀通风设备有限公司 | 深圳市鼎拓达机电有限公司_ 深圳市鼎拓达机电有限公司 | 余压控制器,余压监控系统,余压传感器-浙江巨川电气科技有限公司 | 楼宇门厂家-氟碳漆门-不锈钢大门-单元门-锌合金大门-永康市龙卫门业 | 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 氧化镁|轻质氧化镁厂家|活性氧化镁价格【不好用免费退换】镁神股份 | 手板模型-温州手板模-快速成型厂家-温州星科模具加工厂 | 无负压供水设备-杭州勤铭机电有限公司 | 涡流探伤仪-超声波探伤仪-上海仓信电子科技有限公司 | 压缩强度测定仪-纸管平压强度测定仪-电脑拉力仪-杭州纸邦自动化技术有限公司 | 筱晓(上海)光子技术有限公司官网,MCT探测器,半导体激光二极管,中红外QCL激光器,光纤放大器,光电探测器 | 廊坊微信营销,廊坊小程序开发,廊坊APP开发(安卓_苹果ios开发),微信朋友圈广告,百度推广,廊坊网络公司品牌服务商-河北盛秋网络科技有限公司 | 食品厂净化工程-无尘车间装修改造-净化工程-洁净工程-苏州远盈净化公司 | 中国焊接协会网站—中国焊接信息网;焊接行业最权威访问量最大的专业网站:焊接信息、焊接材料,焊接机器,焊接设备,焊机,焊材,辅助设备,焊机配件,仪器仪表,电动工具,钎焊,送丝机,表面处理,自动化专机,焊锡丝,助焊剂 | 双相钢,双相不锈钢,2507双相不锈钢-海新双相钢| 溶气气浮机_一体化净水设备_污水处理设备_mbr一体化污水处理设备-明基环保 | 深圳注册公司-工商注册代理-深圳注册公司流程及费用-记帐报税-公司注销-[深圳市悟空企业管理(深圳)有限公司] | 永磁耦合_重载永磁软起_能量回馈式调速器_磁力耦合器_江苏磁谷科技股份有限公司官方网站 | 温州网络公司_网站建设_网络营销策划_阿里淘宝店铺服务-温州聚欣网络科技有限公司 |