LINUX系统编程:信号(1)

目录

什么是信号?

为什要有信号呢?

进程接受信号的过程

1.信号的产生

1.1kill命令产生信号

1.2键盘产生信号

1.3系统调用接口

1.3.1killl()

1.3.2raise()

1.3.3abort()

1.4软件条件

1.5异常

1.6对各种情况产生信号的理解

1.6.1kill命令

1.6.2键盘产生信号

1.6.3异常

除零错误

野指针


信号和信号量是两个完全不相干的技术,不要混淆。

什么是信号?

Linux让系统提供让用户给其他进程异步发送消息的一种方式。

站在进程的角度看待信号

1.信号在没被发送之前,进程是认识这个信号。

2.在接受到信号之后,进程是被设定好去怎么处理这个信号的。

3.信号到来的时候,如果进程有更重要的事情要做,这个信号会被临时保存。

4.收到信号之后可以不立即处理,等到机会合适在处理信号。

5.信号产生是不定时,随时都可能接受到信号,所以信号是异步发送的,是别的用户和进程。

为什要有信号呢?

操作系统要求进程有对外部信号响应的能力。(例:该进程发生除0错误,这个时候操作系统就会给进程发信号,让其停止)。

进程接受信号的过程

1.信号的产生

信号是如何产生的呢?

1.1kill命令产生信号

1-34都是标准信号,34之后的是实时信号。

其中每个数字都是一个宏,使用kill命令可以 kill -9 也可以 kill -SIGKILL

1.2键盘产生信号

ctrl + c 和 ctrl + \

信号捕捉:当我们向进程发送一个信号,进程接受信号后,会做出系统设定好的动作,

捕捉信号就是将这个信号的默认动作,改为自定义的动作。

signal(2,handler);

第一个参数就是要捕捉的信号,第二个参数为int,返回之为void的函数指针,捕捉到信号之后,就执行handler函数。

demo代码

大概意思就是进程收到2号信号时,会把2号信号的默认动作替换为handler函数。

#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <signal.h>

using namespace std;

void handler(int sig)
{
    cout<<endl;
    cout<<"get a signal ,number is:"<< sig <<endl;//打印捕捉到的信号
    exit(0);
}

int main()
{
    signal(2,handler);//捕捉2号信号
    while(true)
    {
        ;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值