栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

linux

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux

信号是由用户、系统或者进程发送给目标进程的信息,比如终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序

信号概述 信号4要素:信号编号、名称、对应事件、默认处理动作

每个信号都有一个名称和编号,名字是以"SIG"开头,例如“SIGIO”等

信号定义在signal.h头文件中,信号名称都定义为正整数

具体信号名称可以使用kill -l 来查看信号名字以及序号

信号的处理:

信号处理有三种方式:分别是忽略,捕捉,以及默认系统动作

忽略:假设一个场景,当年在看电视的时候,有人敲门这时候你可以忽略他人

大多数信号可以用这个方式来处理,除了两种信号不能被忽略(SIGKILL和SIGSTOP),因为他们向内核和超级用户提供了进程终止和停止的可靠方法,如果忽略了,那么这个进程变成了没人能管理的进程

捕捉:像极了单片机里的中断,中断处理函数

需要告诉内核,用户希望如何处理某一种信号,就是写一个信号处理函数,然后将这个函数告诉内核,当该信号产生时,内核来调用用户自定义的函数,从而实现某种信号的处理

默认系统动作:对于每个信号来说,系统对应由默认的处理动作,当发生了该信号,系统就会自动执行

信号是如何来使用的?

常用kill命令是一个发送信号的工具

//while1.c
#include 

int main()
{
    while(1);
    return 0;
}

 对于信号来说,最大意义不是用了杀死信号,而是实现一些异步通讯(捕捉信号)的手段,那么如何来自定义信号的处理函数呢?

信号编程

入门级函数;signal

函数原型

#include 
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

高级函数:sigaction

#include 
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
信号处理发送函数

入门版:kill 

#include 
#include 
int kill(pid_t pid, int sig);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
kill(): _POSIX_C_SOURCE

高级版:sigqueue

#include 
int sigqueue(pid_t pid, int sig, const union sigval value);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
sigqueue(): _POSIX_C_SOURCE >= 199309L

捕捉信号:键盘按下ctrl+c(SIGINT)无法退出,系统的默认动作ctrl+c是进程终止,通过捕捉信号,修改默认系统动作,执行用户自定义的函数

#include 
#include 

//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);

void handler(int signum)
{
    printf("get signum = %dn ",signum);
    printf("no quitn");
}

int main()
{
    signal(SIGINT,handler);  //信号注册
    while(1);
    return 0;
}

代码实现

可以收到各种信号

#include 
#include 

//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);

void handler(int signum)
{
    printf("get signum = %dn ",signum);
    switch(signum){
        case 2:
                printf("SIGINT");
                break;
        case 9:
                printf("SIGKILL");
                break;    
        case 10:
                printf("SIGUSR1");
                break;        
    }     
   
}

int main()
{
    signal(SIGINT,handler);  //信号注册
    signal(SIGKILL,handler);  //信号注册
    signal(SIGUSR1,handler);  //信号注册
    while(1);
    return 0;
}

代码实现

// signa2.c
#include 
#include 
#include 
#include 
#include 


int main(int argc,char **argv)
{
    int signum;
    int pid;
    
    signum = atoi(argv[1]);
    pid = atoi(argv[2]);

    printf("signum =%d,pid=%d",signum,pid);
    
    kill(pid,signum);

    return 0;
}

代码实现

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925548.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号