【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神
🎥系列专栏【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于知识分享,与更多的人进行学习交流

如何触发信号

信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程

kill -l 查看系统支持的信号

32,33号信号预留给线程库NTPL

两种信号,经典信号/实时信号

1-31是unix经典信号,软件开发工程师使用,例如进程通信,信号捕捉等。

34-64是自定义信号,一般驱动开发使用,偏底层。

1、终端组合按键触发信号

Ctrl+/(SIGQUIT/3)系统向唯一的前台进程发送2号信号,目标进程被杀死

Ctrl+C(SIGINT/2)系统向唯一的前台进程发送2号信号,目标进程被杀死

Ctrl+Z(SIGTSTP/20)系统向唯一的前台进程发送20号信号,目标进程被挂起

终端组合按键触发的信号会发给唯一的前台进程

写一个无法退出的死循环,使用组合键杀死这个进程

按下Ctrl+C成功杀死这个死循环进程

2、命令发送信号

kill -signo pid

此命令可以向任意进程发送任意信号

kill命令成功杀死进程

3、函数发送信号

使用信号函数需要包含头文件 signal.h

常见信号函数:

kill(pid_t,int signo) 向任意进程发送任意信号

raise(int signo) 向自身进程发送任意信号

void abort(void) 向自身发送SIGABRT/6信号

关于kill函数的使用:

kill函数的第一个参数是进程ID,第二个参数是信号编号。这与kill命令正好相反,所以为了符合使用逻辑,在传入命令行参数时,将命令行第二个参数作为kill函数的第一个参数


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/fcntl.h>
#include <signal.h>

int main(int argc,char **argv)
{
    if(argc<3){
        printf("参数数量错误\n");
        exit(0);
    }
    kill(atoi(argv[2]),atoi(argv[1]));
    return 0;
}

自定义kill命令杀死进程

4、硬件异常产生信号

1)对只读内存进行写操作,属于违规操作硬件,系统向违规进程发送SIGSEGV(11)信号,段错误,杀死违规进程。

例如:当我们尝试修改常量区内存时:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/fcntl.h>


int main()
{
    char *str="this is const";
    str[1]='d';
    return 0;
}

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值