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

    歡迎訪問 生活随笔!

    生活随笔

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

    编程问答

    sigaction函数解析

    發布時間:2025/1/21 编程问答 31 豆豆
    生活随笔 收集整理的這篇文章主要介紹了 sigaction函数解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    sigaction函數的功能是檢查或修改與指定信號相關聯的處理動作(可同時兩種操作)。

    他是POSIX的信號接口,而signal()是標準C的信號接口(如果程序必須在非POSIX系統上運行,那么就應該使用這個接口)

    給信號signum設置新的信號處理函數act, 同時保留該信號原有的信號處理函數oldact

    int?sigaction(int?signo,const?struct?sigaction?*restrict act,

    ??????????????struct?sigaction?*restrict oact);

    結構sigaction定義如下:

    struct?sigaction{
    ??void?(*sa_handler)(int);
    ?? sigset_t sa_mask;
    ??int?sa_flag;
    ??void?(*sa_sigaction)(int,siginfo_t?*,void?*);
    };

    sa_handler字段包含一個信號捕捉函數的地址

    sa_mask字段說明了一個信號集,在調用該信號捕捉函數之前,這一信號集要加進進程的信號屏蔽字中。僅當從信號捕捉函數返回時再將進程的信號屏蔽字復位為原先值。

    sa_flag是一個選項,主要理解兩個

    SA_INTERRUPT 由此信號中斷的系統調用不會自動重啟
    SA_RESTART 由此信號中斷的系統調用會自動重啟

    SA_SIGINFO 提供附加信息,一個指向siginfo結構的指針以及一個指向進程上下文標識符的指針

    最后一個參數是一個替代的信號處理程序,當設置SA_SIGINFO時才會用他。

    例子:

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>

    void show_handler(int sig)
    {
    ??? printf("I got signal %d\n", sig);
    ??? int i;
    ??? for(i = 0; i < 5; i++) {
    ??????? printf("i = %d\n", i);
    ??????? sleep(1);
    ??? }
    }

    int main(void)
    {
    ??? int i = 0;
    ??? struct?sigaction?act, oldact;
    ??? act.sa_handler = show_handler;
    ??? sigaddset(&act.sa_mask, SIGQUIT);?//見注(1)
    ??? act.sa_flags = SA_RESETHAND | SA_NODEFER;?//見注(2)
    ??? //act.sa_flags = 0;?//見注(3)

    ????sigaction(SIGINT, &act, &oldact);
    ??? while(1) {
    ??????? sleep(1);
    ??????? printf("sleeping %d\n", i);
    ??????? i++;
    ??? }
    }


    注:
    (1)??? 如果在信號SIGINT(Ctrl + c)的信號處理函數show_handler執行過程中,本進程收到信號SIGQUIT(Crt+\),將阻塞該信號,直到show_handler執行結束才會處理信號SIGQUIT。


    (2)????SA_NODEFER??? ?? 一般情況下, 當信號處理函數運行時,內核將阻塞<該給定信號 -- SIGINT>。但是如果設置了SA_NODEFER標記, 那么在該信號處理函數運行時,內核將不會阻塞該信號。 SA_NODEFER是這個標記的正式的POSIX名字(還有一個名字SA_NOMASK,為了軟件的可移植性,一般不用這個名字)????
    ??? ???SA_RESETHAND??? 當調用信號處理函數時,將信號的處理函數重置為缺省值。 SA_RESETHAND是這個標記的正式的POSIX名字(還有一個名字SA_ONESHOT,為了軟件的可移植性,一般不用這個名字)???


    (3)??? 如果不需要重置該給定信號的處理函數為缺省值;并且不需要阻塞該給定信號(無須設置sa_flags標志),那么必須將sa_flags清零,否則運行將會產生段錯誤。但是sa_flags清零后可能會造成信號丟失!

    http://webcache.googleusercontent.com/search?q=cache:B2HsD1Zf2f8J:hi.baidu.com/operationsystem/blog/item/bb215411f4dc61f4c2ce79e6.html/cmtid/c150423c8b8feae13d6d97b0+sigaction&cd=1&hl=zh-CN&ct=clnk

    總結

    以上是生活随笔為你收集整理的sigaction函数解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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