0
点赞
收藏
分享

微信扫一扫

Linux入门之进程信号|信号产生的方式

王小沫 2023-09-03 阅读 59

文章目录

一、信号入门

1.linux信号的基本概念

2.使用kill -l 命令可以查看系统定义的信号列表

3.信号处理常见方式

二、产生信号

1.通过终端按键产生信号

2.通过调用系统函数向进程发信号

3.由软条件产生信号

4.硬件异常产生信号

    1. /0异常

    2.模拟野指针



一、信号入门

1.linux信号的基本概念

2.使用kill -l 命令可以查看系统定义的信号列表

  • 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到
  • 编号34以上的信号都是实时信号

3.信号处理常见方式

  1. 忽略此信号
  2. 执行该信号的默认处理动作
  3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号

二、产生信号

1.通过终端按键产生信号

SIGINT默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且设置core dump

core dump:

2.通过调用系统函数向进程发信号

  1. kill命令 是调用kill函数实现的,kill函数可以给一个指定的进程发送指定的信号
#include<signal.h>
int kill(pid_t pid,int signo);
//发送成功返回0,失败返回-1

     2.rasie函数,可以给当前进程发送指定的信号(自己给自己发信号)

int raise(int signo)
//成功返回0,失败返回-1

    3.abort函数 使当前进程接收到信号异常终止,就想exit一样

void abort(void);
abort函数总是回成功的,所以没有返回值

3.由软条件产生信号

#include<unistd.h>

usigned int alarm(unsigned int seconds);
//调用alarm函数可以设定一个闹钟,告诉os在seconds秒之后向进程发送SIGALRM信号,该信号的默认处理动作是终止当前进程

//该函数的返回值是0,或者是以前设定闹钟的时间还剩余的秒数
如:设定一个30s的闹钟,在20s时由于别的进程让alarm响了,此时函数返回10s

4.硬件异常产生信号

    1. /0异常

    2.模拟野指针


void handler(int sig)
{
    printf("catch a sig: %d\n",sig);
}


int main()
{
    signal(SIGSEVE,handler);
    int * p = nullptr;
    *p = 100;
}

运行上述代码,发现有segmentation falut段错误。其具体原因是:在执行进程是,通过页表kv转换到物理内存,如果kv有映射,要看mmu权限,有权限,写入,无权限mmu报错,os找到进程pcb,向进程发送11号信号。如果kv无映射,mmu映射报错。


 

举报

相关推荐

0 条评论