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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux基本信号的使用

發布時間:2024/4/17 linux 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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可以使信號的響應方式回復默認方式。
代碼:

#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 signal(SIGINT, SIG_DFL);//將Ctral+C(信號SIGINT)的響應方式改為默認方式10 }11 12 int main()13 {14 signal(SIGINT, fun);//將Ctral+C(信號SIGINT)響應方式改為回調函數fun的動作15 while(1)16 {17 printf("main run\n");18 sleep(1);19 }20 return 0;21 } ~

運行結果:

三、發送信號-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基本信号的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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