Linux基本信号的使用
一、信號(hào)的基本概念
1.基本信號(hào)對(duì)應(yīng)的響應(yīng)
信號(hào)是系統(tǒng)響應(yīng)某個(gè)條件而產(chǎn)生的事件,進(jìn)程接收到信號(hào)會(huì)執(zhí)行相應(yīng)的操作。
與信號(hào)有關(guān)的系統(tǒng)調(diào)用在“signal.h”頭文件中有聲明
常見(jiàn)信號(hào)的值,及對(duì)應(yīng)的功能說(shuō)明:
2.信號(hào)的值在系統(tǒng)源碼中的宏定義
#define SIGHUP 1 #define SIGINT 2 //鍵盤按下 Ctrl+c 時(shí),會(huì)產(chǎn)生該信號(hào) #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGABRT 6 #define SIGIOT 6 #define SIGBUS 7 #define SIGFPE 8 #define SIGKILL 9 //該信號(hào)的響應(yīng)方式不允許改變 #define SIGUSR1 10 #define SIGSEGV 11 #define SIGUSR2 12 #define SIGPIPE 13 //讀端關(guān)閉的描述符,寫(xiě)端寫(xiě)入時(shí)產(chǎn)生,該信 號(hào)會(huì)終止程序 #define SIGALRM 14 #define SIGTERM 15 //系統(tǒng) kill 命令默認(rèn)發(fā)送的信號(hào) #define SIGSTKFLT 16 #define SIGCHLD 17 //子進(jìn)程結(jié)束后,會(huì)默認(rèn)給父進(jìn)程發(fā)送該信 號(hào) #define SIGCONT 18 #define SIGSTOP 19 #define SIGTSTP 20 #define SIGTTIN 21 #define SIGTTOU 22 #define SIGURG 23二、信號(hào)響應(yīng)方式的修改-signal()
1.signal()函數(shù)
sighandler_t是函數(shù)指針,函數(shù)原型為 void fun(int)
signum是信號(hào)值
sighandler_t signal(int signum, sighandler_t handler)就是當(dāng)signum信號(hào)產(chǎn)生時(shí),響應(yīng)方式為回調(diào)函數(shù)handler的動(dòng)作。
回調(diào)函數(shù)SIG_IGN是忽略信號(hào),即不作任何響應(yīng),SIG_DFL是信號(hào)的響應(yīng)方式為默認(rèn)方式。
2.signal()函數(shù)的使用
我們長(zhǎng)使用的Ctral+c就是觸發(fā)了信號(hào)SIGINT(值為2),比如我們想要修改Ctral+c信號(hào)的響應(yīng)方式:
1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<signal.h>5 6 void fun(int sig)//該函數(shù)的動(dòng)作即為信號(hào)修改后的響應(yīng)方式7 {8 printf("這是信號(hào)SIGINT(%d)的相應(yīng)方式\n", sig);9 }10 11 int main()12 {13 signal(SIGINT, fun);//將Ctral+c(信號(hào)SIGINT)響應(yīng)方式修改為回調(diào)函數(shù)fun的動(dòng)作14 while(1)15 {16 printf("main run\n");17 sleep(1);18 }19 return 0;20 }運(yùn)行結(jié)果:
可以修改其他信號(hào)的相應(yīng)方式,只需要將signal中的第一個(gè)參數(shù)信號(hào)SIGINT修改為其他信號(hào)就可以了。
如果想要第一次修改Ctral+C的響應(yīng)方式,第二次讓它默認(rèn)響應(yīng)方式響應(yīng)呢?上面說(shuō)了SIG_DFL可以使信號(hào)的響應(yīng)方式回復(fù)默認(rèn)方式。
代碼:
運(yùn)行結(jié)果:
三、發(fā)送信號(hào)-kill()
1.kill函數(shù)原型
成功返回0,失敗返回-1.
參數(shù)pid是進(jìn)程id, sig是信號(hào),即給進(jìn)程id為id的進(jìn)程發(fā)送信號(hào)sig。
pid > 0 指定將信號(hào)發(fā)送個(gè)那個(gè)進(jìn)程
pid == 0 信號(hào)被發(fā)送到和當(dāng)前進(jìn)程在同一個(gè)進(jìn)程組的進(jìn)程
pid == -1 將信號(hào)發(fā)送給系統(tǒng)上有權(quán)限發(fā)送的所有的進(jìn)程
pid < -1 將信號(hào)發(fā)送給進(jìn)程組 id 等于 pid 絕對(duì)值,并且有權(quán)限發(fā)送的所有的進(jìn)程。
sig 指定發(fā)送信號(hào)的類型。
2.kill函數(shù)的使用
#include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>4 #include <signal.h>5 6 int main(int argn, char* argv[])7 {8 if(argn != 3)9 {10 printf("argc error\n");11 exit(0);12 }13 14 int pid = 0;15 int sig = 0;16 sscanf(argv[1],"%d",&pid);17 sscanf(argv[2],"%d",&sig);18 19 if(kill(pid,sig) == -1)20 {21 perror("kill error");22 }23 exit(0);24 }下面運(yùn)行一個(gè)程序,用自己寫(xiě)的kill命令結(jié)束其運(yùn)行:
用自己的kill可執(zhí)行文件向signal_SIGINT程序發(fā)送9號(hào)命令,將其殺死。
總結(jié)
以上是生活随笔為你收集整理的Linux基本信号的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机网络——HTTP协议和Web
- 下一篇: Linux 文件属性和权限详解