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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

C语言笔记-22-Linux基础-信号

發(fā)布時間:2024/3/24 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言笔记-22-Linux基础-信号 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C語言筆記-22-Linux基礎(chǔ)-信號


文章目錄

  • C語言筆記-22-Linux基礎(chǔ)-信號
  • 前言
  • 一、信號概括
  • 二、信號函數(shù)
  • 三、信號的產(chǎn)生
      • pause 阻塞線程
  • 四、信號掩碼集和未決信號集
  • 五、設(shè)置阻塞信號
      • 信號集類型相關(guān)操作
      • 設(shè)置信號集到信號掩碼集
  • 六、獲取未決信號
  • 總結(jié)


前言

自學(xué)筆記,沒有歷史知識鋪墊(省略百度部分)C語言筆記-22-Linux基礎(chǔ)-信號


一、信號概括

軟件中的中斷信號,軟中斷、異常中斷都是信號,中斷機制,信號處理程序。

系統(tǒng)提供的中斷信號

linux 64個,數(shù)量根據(jù)系統(tǒng)不同。此處展示mac中斷信號

No Name Default Action Description 1 SIGHUP terminate process terminal line hangup 2 SIGINT terminate process interrupt program 3 SIGQUIT create core image quit program 4 SIGILL create core image illegal instruction 5 SIGTRAP create core image trace trap 6 SIGABRT create core image abort program (formerly SIGIOT) 7 SIGEMT create core image emulate instruction executed 8 SIGFPE create core image floating-point exception 9 SIGKILL terminate process kill program 10 SIGBUS create core image bus error 11 SIGSEGV create core image segmentation violation 12 SIGSYS create core image non-existent system call invoked 13 SIGPIPE terminate process write on a pipe with no reader 14 SIGALRM terminate process real-time timer expired 15 SIGTERM terminate process software termination signal 16 SIGURG discard signal urgent condition present on socket 17 SIGSTOP stop process stop (cannot be caught or ignored) 18 SIGTSTP stop process stop signal generated from keyboard 19 SIGCONT discard signal continue after stop 20 SIGCHLD discard signal child status has changed 21 SIGTTIN stop process background read attempted from control terminal 22 SIGTTOU stop process background write attempted to control terminal 23 SIGIO discard signal I/O is possible on a descriptor (see fcntl(2)) 24 SIGXCPU terminate process cpu time limit exceeded (see setrlimit(2)) 25 SIGXFSZ terminate process file size limit exceeded (see setrlimit(2)) 26 SIGVTALRM terminate process virtual time alarm (see setitimer(2)) 27 SIGPROF terminate process profiling timer alarm (see setitimer(2)) 28 SIGWINCH discard signal Window size change 29 SIGINFO discard signal status request from keyboard 30 SIGUSR1 terminate process User defined signal 1 31 SIGUSR2 terminate process User defined signal 2

信號的產(chǎn)生 > 信號的到達 > 信號的處理

  • 未決信號:信號產(chǎn)生到處理的過程中,信號處于未決狀態(tài)(未處理狀態(tài))
  • 信號處理三種方法

  • SIG_IGN 缺省處理 (大部分進程的缺省處理,都是終止當前進程,即信號2)
  • SIG_DFL 忽略處理
  • 用戶自定義處理
  • 二、信號函數(shù)

    typedef void (*sig_t) (int);
    改變進程的信號處理函數(shù)
    sig_t signal(int sig, sig_t func);
    入?yún)?/strong>

  • sig 信號編號
  • func 指定信號處理函數(shù)指針
  • 返回值
    錯誤:SIG_ERR errno被設(shè)置
    成功:返回原來的信號處理函數(shù)指針

    代碼示例

    #include <unistd.h> #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {signal(SIGINT, SIG_IGN);sleep(10);return 0; } // 執(zhí)行結(jié)果 ctrl+c中斷時,將無法生效 dony15$ ./main ^C^C^C^C^C^C^C^C^C^C^C^C^C^C #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h>void customHandle(int sig) {printf("自定義函數(shù)執(zhí)行%d\n", sig);return; } int main(int argc, char *argv[]) {signal(SIGINT, customHandle);sleep(10);return 0; }// ctrl+c中斷時 執(zhí)行結(jié)果 dony15$ ./main ^C自定義函數(shù)執(zhí)行2// 終端使用kill發(fā)送信號時 執(zhí)行結(jié)果 kill -2 16817 自定義函數(shù)執(zhí)行2

    三、信號的產(chǎn)生

  • 硬件產(chǎn)生信號: ctrl+c ctrl+\
  • 使用命令給進程發(fā)信號: kill -信號編號 進程pid
  • 使用系統(tǒng)調(diào)用或庫函數(shù),向進程發(fā)送信號:
    3.1. kill() 給指定進程發(fā)送指定信號
    3.2. raise() 給當前進程發(fā)送信號
    3.3. alarm() 定時發(fā)送信號
    3.4. abort() 給自己發(fā)送異常終止信號
    3.5. setitimer() 設(shè)置定時器(鬧鐘)。可代替alarm函數(shù)。精度微妙us,可以實現(xiàn)周期定時。
  • alarm定時發(fā)送信號示例

    #include <unistd.h> #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {alarm(1);for (int i = 0; i>=0; i++){printf("i=%d \n",i);}return 0; }// 執(zhí)行結(jié)果 i=0 i=1 i=2 ... i=7031440 i=7031441

    pause 阻塞線程

    讓當前進程、線程阻塞,等待信號,執(zhí)行完信號處理函數(shù)后返回。
    int pause(void);
    固定返回 -1 errno被設(shè)置

    #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h>void customHandle(int sig) {printf("自定義函數(shù)執(zhí)行%d\n", sig);return; } int main(int argc, char *argv[]) {signal(SIGINT, customHandle);int result= pause();perror("pause");return 0; }// 終端使用kill發(fā)送信號時 執(zhí)行結(jié)果 kill -2 4687 pause: Interrupted system call 自定義函數(shù)執(zhí)行2

    四、信號掩碼集和未決信號集

    PCB中以數(shù)組形式,bit元素記錄信號掩碼集和未決信號集,數(shù)組下標長度對應(yīng)信號編碼 如arr[0]對應(yīng)SIGHUP

  • 信號掩碼集: 記錄信號是否被阻塞,元素為1時,表示該下標對應(yīng)信號被阻塞,0時標識未阻塞
  • 未決信號集:記錄信號是否未決,元素為1時,表示該下標對應(yīng)信號未決,0時標識沒有信號產(chǎn)生
  • 同一數(shù)組下標(同一信號),掩碼集=1 表示信號阻塞。此時對應(yīng)數(shù)組下標的未決信號無論是0還是1,都無法執(zhí)行。
  • 同一數(shù)組下標(同一信號),掩碼集=0 表示信號不阻塞。此時對應(yīng)數(shù)組下標的未決信號=1時,表示信號到達即可執(zhí)行。
  • 同一數(shù)組下標(同一信號),掩碼集=0 表示信號不阻塞。此時對應(yīng)數(shù)組下標的未決信號=0時,表示沒有信號。
  • 五、設(shè)置阻塞信號

    信號集類型相關(guān)操作

    #include <signal.h> // sigset_t 信號集類型 // 將傳入的信號集初始化為空 0 sig empty set(set表示集,非設(shè)置的意思)。成功返回0 失敗 -1 errorno int sigemptyset(sigset_t *set); // 將傳入的信號集初始化為填滿狀態(tài) 1 sig fill set。 成功返回0 失敗 -1 errorno int sigfillset(sigset_t *set); // 將信號添加到信號集中 sig add set。 成功返回0 失敗 -1 errorno int sigaddset(sigset_t *set, int signo); // 將信號從信號集中移除 sig del set。 成功返回0 失敗 -1 errorno int sigdelset(sigset_t *set, int signo); // 判斷信號是否為信號集中的成員 sig is member。 真1 假0 int sigismember(const sigset_t *set, int signo);

    示例代碼

    #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h>int main(int argc, char *argv[]) {sigset_t set;sigemptyset(&set);sigaddset(&set, 1);sigaddset(&set, 2);int isMember = sigismember(&set, 2);isMember ? printf("Y\n") : printf("N\n");sigdelset(&set, 2);int isMember2 = sigismember(&set, 2);isMember2 ? printf("Y\n") : printf("N\n");return 0; } // 輸出結(jié)果 Y N

    設(shè)置信號集到信號掩碼集

    // SIG_BLOCK 將傳入信號集與原有信號集的并集,更新到信號掩碼集。 // SIG_UNBLOCK 將傳入信號集從原有信號集排除,更新到信號掩碼集。 // SIG_SETMASK 保存?zhèn)魅胄盘柤叫盘栄诖a集,并覆蓋與原有信號集交集部分。 // oset 原信號掩碼集,NULL 丟棄原信號掩碼集。 int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset); // 返回 0成功 -1失敗 errorno

    示例代碼

    #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h>int main(int argc, char *argv[]) {sigset_t set;sigemptyset(&set);// 阻塞2號信號sigaddset(&set, 2);sigprocmask(SIG_SETMASK, &set, NULL);while (1);printf("end\n");return 0; }// 輸出結(jié)果 嘗試ctrl+c 觸發(fā)2號信號,由于設(shè)置2號信號在信號掩碼中阻塞,此時失效,嘗試使用3號信號ctrl+$結(jié)束程序 dony15$ ./a.out ^C^C^C^C^C^C^C^C^C^\Quit: 3

    六、獲取未決信號

    總結(jié)

    本章主要為C語言筆記-22-Linux基礎(chǔ)-信號

    總結(jié)

    以上是生活随笔為你收集整理的C语言笔记-22-Linux基础-信号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。