linux的基础知识——signal信号捕捉,信号集操作函数
生活随笔
收集整理的這篇文章主要介紹了
linux的基础知识——signal信号捕捉,信号集操作函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.signal捕捉信號
- 2.信號集操作函數
- 3.sigprocmask函數
- 4.sigpending函數
- 5.例子1:打印某個進程未決信號集
- 6.例子2:signal函數的注冊捕捉執行函數
- 7.sigaction函數
- 8.信號捕捉特性
- 9.內核實現信號捕捉過程
1.signal捕捉信號
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);\qquadsignal(SIGALRM,myfunc)函數會捕捉SIGALRM信號,捕捉之后會執行myfunc函數,而不會終止當前進程。
#include<stdio.h> #include<sys/time.h> #include<unistd.h> #include<signal.h> #include<stdlib.h>void myfunc(int signo) {printf("hello world\n"); }int main() {struct itimerval it , oldit;signal(SIGALRM,myfunc);//注冊SIGALRM信號的捕捉處理函數it.it_value.tv_sec = 5;it.it_value.tv_usec = 0;it.it_interval.tv_sec = 1;it.it_interval.tv_usec =0;if(setitimer(ITIMER_REAL,&it,&oldit)==-1){perror("setitimer error");exit(1);}while(1);return 0; }2.信號集操作函數
\qquad內核通過讀取未決信號集來判斷信號是否應該被處理。信號屏蔽字mask可以影響未決信號集,而我們可以在應用程序中自定義set來改變mask,以達到屏蔽指定信號的目的。
#include <signal.h> 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(const sigset_t *set, int signum);3.sigprocmask函數
4.sigpending函數
5.例子1:打印某個進程未決信號集
\qquad其中3號信號在進程中會發出,然后被屏蔽,打印前后的未決信號集
#include<stdio.h> #include<signal.h> #include<unistd.h>void printped(sigset_t *ped) {int i;for(i=1;i<33;i++){if(sigismember(ped,i)==1){putchar('1');}else{putchar('0');}}printf("\n"); } int main() {sigset_t myset,oldset,ped;sigemptyset(&myset);sigaddset(&myset,SIGQUIT);sigprocmask(SIG_BLOCK,&myset,&oldset);while(1){sigpending(&ped);printped(&ped);sleep(1);}return 0; }6.例子2:signal函數的注冊捕捉執行函數
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> #include<stdlib.h>typedef void (*sighandler_t) (int);void catchsigint(int signo) {system("aplay /home/zhaoxr/wo.wav");printf("hello music\n"); }int main() {sighandler_t handler;handler = signal(SIGINT,catchsigint);if(handler==SIG_ERR){perror("signal error");exit(1);}while(1);return 0; }7.sigaction函數
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<signal.h>void docatch(int signo) {while(1){printf("hello\n");sleep(1);} }int main() {int ret;struct sigaction act;act.sa_handler = docatch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask,SIGTSTP);act.sa_flags = 0;ret = sigaction(SIGINT,&act,NULL);if(ret<0){perror("sigaction error");exit(1);}while(1);return 0; }8.信號捕捉特性
9.內核實現信號捕捉過程
總結
以上是生活随笔為你收集整理的linux的基础知识——signal信号捕捉,信号集操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络(一)-概述
- 下一篇: linux 其他常用命令