linux的基础知识——signal信号捕捉,信号集操作函数
生活随笔
收集整理的這篇文章主要介紹了
linux的基础知识——signal信号捕捉,信号集操作函数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1.signal捕捉信號(hào)
- 2.信號(hào)集操作函數(shù)
- 3.sigprocmask函數(shù)
- 4.sigpending函數(shù)
- 5.例子1:打印某個(gè)進(jìn)程未決信號(hào)集
- 6.例子2:signal函數(shù)的注冊(cè)捕捉執(zhí)行函數(shù)
- 7.sigaction函數(shù)
- 8.信號(hào)捕捉特性
- 9.內(nèi)核實(shí)現(xiàn)信號(hào)捕捉過(guò)程
1.signal捕捉信號(hào)
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);\qquadsignal(SIGALRM,myfunc)函數(shù)會(huì)捕捉SIGALRM信號(hào),捕捉之后會(huì)執(zhí)行myfunc函數(shù),而不會(huì)終止當(dāng)前進(jìn)程。
#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);//注冊(cè)SIGALRM信號(hào)的捕捉處理函數(shù)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.信號(hào)集操作函數(shù)
\qquad內(nèi)核通過(guò)讀取未決信號(hào)集來(lái)判斷信號(hào)是否應(yīng)該被處理。信號(hào)屏蔽字mask可以影響未決信號(hào)集,而我們可以在應(yīng)用程序中自定義set來(lái)改變mask,以達(dá)到屏蔽指定信號(hào)的目的。
#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函數(shù)
4.sigpending函數(shù)
5.例子1:打印某個(gè)進(jìn)程未決信號(hào)集
\qquad其中3號(hào)信號(hào)在進(jìn)程中會(huì)發(fā)出,然后被屏蔽,打印前后的未決信號(hào)集
#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函數(shù)的注冊(cè)捕捉執(zhí)行函數(shù)
#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函數(shù)
#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.信號(hào)捕捉特性
9.內(nèi)核實(shí)現(xiàn)信號(hào)捕捉過(guò)程
總結(jié)
以上是生活随笔為你收集整理的linux的基础知识——signal信号捕捉,信号集操作函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机网络(一)-概述
- 下一篇: linux基础知识——wait函数和wa