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