C语言笔记-22-Linux基础-信号
生活随笔
收集整理的這篇文章主要介紹了
C语言笔记-22-Linux基础-信号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C語言筆記-22-Linux基礎-信號
文章目錄
- C語言筆記-22-Linux基礎-信號
- 前言
- 一、信號概括
- 二、信號函數
- 三、信號的產生
- pause 阻塞線程
- 四、信號掩碼集和未決信號集
- 五、設置阻塞信號
- 信號集類型相關操作
- 設置信號集到信號掩碼集
- 六、獲取未決信號
- 總結
前言
自學筆記,沒有歷史知識鋪墊(省略百度部分)C語言筆記-22-Linux基礎-信號
一、信號概括
軟件中的中斷信號,軟中斷、異常中斷都是信號,中斷機制,信號處理程序。
系統提供的中斷信號
linux 64個,數量根據系統不同。此處展示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信號的產生 > 信號的到達 > 信號的處理
信號處理三種方法
二、信號函數
typedef void (*sig_t) (int);
改變進程的信號處理函數
sig_t signal(int sig, sig_t func);
入參
返回值
錯誤:SIG_ERR errno被設置
成功:返回原來的信號處理函數指針
代碼示例
#include <unistd.h> #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {signal(SIGINT, SIG_IGN);sleep(10);return 0; } // 執行結果 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("自定義函數執行%d\n", sig);return; } int main(int argc, char *argv[]) {signal(SIGINT, customHandle);sleep(10);return 0; }// ctrl+c中斷時 執行結果 dony15$ ./main ^C自定義函數執行2// 終端使用kill發送信號時 執行結果 kill -2 16817 自定義函數執行2三、信號的產生
3.1. kill() 給指定進程發送指定信號
3.2. raise() 給當前進程發送信號
3.3. alarm() 定時發送信號
3.4. abort() 給自己發送異常終止信號
3.5. setitimer() 設置定時器(鬧鐘)。可代替alarm函數。精度微妙us,可以實現周期定時。
alarm定時發送信號示例
#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; }// 執行結果 i=0 i=1 i=2 ... i=7031440 i=7031441pause 阻塞線程
讓當前進程、線程阻塞,等待信號,執行完信號處理函數后返回。
int pause(void);
固定返回 -1 errno被設置
四、信號掩碼集和未決信號集
PCB中以數組形式,bit元素記錄信號掩碼集和未決信號集,數組下標長度對應信號編碼 如arr[0]對應SIGHUP
五、設置阻塞信號
信號集類型相關操作
#include <signal.h> // sigset_t 信號集類型 // 將傳入的信號集初始化為空 0 sig empty set(set表示集,非設置的意思)。成功返回0 失敗 -1 errorno int sigemptyset(sigset_t *set); // 將傳入的信號集初始化為填滿狀態 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; } // 輸出結果 Y N設置信號集到信號掩碼集
// SIG_BLOCK 將傳入信號集與原有信號集的并集,更新到信號掩碼集。 // SIG_UNBLOCK 將傳入信號集從原有信號集排除,更新到信號掩碼集。 // SIG_SETMASK 保存傳入信號集到信號掩碼集,并覆蓋與原有信號集交集部分。 // 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; }// 輸出結果 嘗試ctrl+c 觸發2號信號,由于設置2號信號在信號掩碼中阻塞,此時失效,嘗試使用3號信號ctrl+$結束程序 dony15$ ./a.out ^C^C^C^C^C^C^C^C^C^\Quit: 3六、獲取未決信號
總結
本章主要為C語言筆記-22-Linux基礎-信號
總結
以上是生活随笔為你收集整理的C语言笔记-22-Linux基础-信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python删除文件中指定内容
- 下一篇: 【Archlinux】(3) —— dw