LinuxC——5.信号

Posted Steve Yu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinuxC——5.信号相关的知识,希望对你有一定的参考价值。

LinuxC——5.信号

1.??信号

信号是一种通信机制。

常用信号

SIGABRT 6 终止进程,abort函数产生

SIGALRM 14 超时,调用alarm产生

SIGBUS 7 硬件故障

SIGCHLD 17 子进程状态改变

SIGINT 2 终止进程

SIGIO 29 异步通知信号

SIGKILL 9 无条件终止一个进程,不可被捕获或忽略

SIGTERM 15 kill pid默认的信号

2.??kill命令

kill -l  查询信号列表

kill +信号编号 PID
比如kill -15 13000
发送一个15的信号给13000
  
kill -SIGRILL 3000
  
#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

pkill -SIGINT a.out // 杀死a.out

3.??signal

一般来说,大多数发送信号,因为内核、硬件发生了一些事情

core文件

某些信号终止进程的时候,保存程序当前结束的时候,进程在内存中的代码和数据。

signal函数
  
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
// 调用成功返回上次处理方式,失败返回
signum 信号编号
hander 捕获函数
#include <stdio.h>
#include <signal.h>
int main() {
        signal(SIGINT, SIG_IGN);
        signal(SIGINT, SIG_DFL);
        while(1) {}
        return 0;
}

// SIGINT 2 control+c
// SIG_IGN 忽略信号处理
// SIG_DFL 使用默认信号处理
#define SIG_IGN ((void(*)(int))0)
#define SIG_DEF ((void(*)(int))1)
#define SIG_ERR ((void(*)(int))-1)

// KILL信号不能忽略和捕获
使用fork进行复制信号,则子进程继承父进程的信号
在调用exec加载新程序后,fork之前,父进程设置的是忽略或者默认,新程序依然有效
在调用exec加载新程序后,fork之后,父进程设置的自定义,新程序无效

4.kill、raise、alarm

  • kill——指定pid发送信号
  • raise——当前进程发送信号
  • alarm——设置一个时间,进行发送SIGALRM信号(默认是终止)
  • pause——永久挂起
进程pause或sleep的时候,我们进行发送一个空的捕获函数,进程被唤醒

5.信号屏蔽字

信号屏蔽字:放在进程表task_struct结构体变量中。信号屏蔽字是一个64位的unsigned int数字,如果为1表示信号屏蔽了,默认信号屏蔽字的值都为0

  • sigempty # 全部设置为1
  • sigaddset # 进行赋值
  • sigprocmask # 进行信号屏蔽
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(int h, &set, NULL);

以上是关于LinuxC——5.信号的主要内容,如果未能解决你的问题,请参考以下文章

Linux信号专题一什么是信号

Android webview 崩溃“致命信号 5 (SIGTRAP)”

linux c 退出进程的代码

linux c 退出进程的代码

C多线程编程信号处理

如何修复信号处理程序分配