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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux的基础知识——signal信号捕捉,信号集操作函数

發布時間:2024/7/19 linux 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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信号捕捉,信号集操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。