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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux基本信号的使用

發(fā)布時(shí)間:2024/4/17 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux基本信号的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、信號(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)方式。
代碼:

#include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<signal.h>5 6 void fun(int sig)7 {8 printf("這是信號(hào)SIGINT(%d)的相應(yīng)方式\n", sig);9 signal(SIGINT, SIG_DFL);//將Ctral+C(信號(hào)SIGINT)的響應(yīng)方式改為默認(rèn)方式10 }11 12 int main()13 {14 signal(SIGINT, fun);//將Ctral+C(信號(hào)SIGINT)響應(yīng)方式改為回調(diào)函數(shù)fun的動(dòng)作15 while(1)16 {17 printf("main run\n");18 sleep(1);19 }20 return 0;21 } ~

運(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。