C语言笔记-22-Linux基础-信号
生活随笔
收集整理的這篇文章主要介紹了
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)生 > 信號的到達 > 信號的處理
信號處理三種方法
二、信號函數(shù)
typedef void (*sig_t) (int);
改變進程的信號處理函數(shù)
sig_t signal(int sig, sig_t func);
入?yún)?/strong>
返回值
錯誤: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)生
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=7031441pause 阻塞線程
讓當前進程、線程阻塞,等待信號,執(zhí)行完信號處理函數(shù)后返回。
int pause(void);
固定返回 -1 errno被設(shè)置
四、信號掩碼集和未決信號集
PCB中以數(shù)組形式,bit元素記錄信號掩碼集和未決信號集,數(shù)組下標長度對應(yīng)信號編碼 如arr[0]對應(yīng)SIGHUP
五、設(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python删除文件中指定内容
- 下一篇: 【Archlinux】(3) —— dw