信号
kill -l 查看有哪些信号
基本概念
软件模拟中断,进程接收到信号后做出相应相应
信号产生
-
硬件
- 执行非法指令
- 访问非法内存[图片]
- 驱动程序
-
软件
- 控制台:
- ctrl+c中断信号
- ctrl+l退出信号
- ctrl+z停止信号
- kill命令
- 程序调用kill()函数
- 控制台:
信号的处理方式
- 忽略:进程当信号从来没有发生过
- 捕获:进程会调用相应的处理函数,进行相应处理
- 默认:使用系统默认的处理方式来处理信号
- kill -9 pid号 杀死进程
- pkill 进程名字 杀死进程
常见信号分析
信号名 | 信号编号 | 产生原因 | 默认处理方式 |
---|---|---|---|
SIGHUP | 1 | 关闭终端 | 终止 |
SIGINT | 2 | ctrl+c | 终止 |
SIGQUIT | 3 | ctrl+\ | 终止+转储 |
SIGABRT | 6 | abort() | 终止+转储 |
SIGPE | 8 | 算术错误 | 终止 |
SIGKILL | 9 | kill -9 pid | 终止,不可捕获、忽略 |
SIGUSR1 | 10 | 自定义 | 忽略 |
SIGSEGV | 11 | 段错误 | 终止+转储 |
SIGUSR2 | 12 | 自定义 | 忽略 |
SIGALRM | 14 | alarm() | 终止 |
SIGTERM | 15 | kill pid | 终止 |
SIGCHLD | 17 | (子)状态变化 | 忽略 |
SIGSTOP | 19 | ctrl+z | 暂停,不可捕获/忽略 |
signal_kill_raise函数
signal:设置某一信号的对应动作
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数:
- signum:指明了所要处理的信号类型
- handler:
- SIG_IGN:忽略
- SIG_DFL:默认
- *void(sighander_t)(int) : 自定义
返回值:
成功:上次设置的hander
失败:SIG_ERR
#include<stdio.h>
#include<sys/wait.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
void signal_handler(int sig)
{
if(sig == SIGINT)
{
printf("I have get SIGINT\r\n");
printf("the signal has been restored to default processing mode!\r\n");
signal(SIGINT,SIG_DFL);
}
}
int main()
{
signal(SIGINT,signal_handler);
while(1)
{
printf("waiting for the SIGINT signal ,please enter\"ctrl+c\"...\r\n");
sleep(4);
}
return 0;
}
kill函数:向指定进程发送信号
int kill(pid_t pid,int sig)
参数:
pid 进程id
sig 发送的信号
返回值
成功 0
失败 -1
raise函数:向当前进程发信号
int raise(int sig)
参数:
sig 发送的信号
返回值 :
成功 0
失败 -1
#include<stdio.h>
#include<sys/wait.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
int main()
{
pid_t pid;
int ret;
if((pid = fork()) < 0)
{
printf("forkverror\r\n");
exit(0);
}
else if(pid == 0)
{
printf("child is waiting for SIGSTOP signal\r\n");
raise(SIGSTOP);//ctrl+z
printf("child won't run here forever\r\n");
exit(0);
}
else{
sleep(3);
if((ret = kill(pid,SIGKILL)) == 0)
{
printf("parent kill %d\r\n",pid);
}
wait(NULL);
printf("parent exit\r\n");
exit(0);
}
return 0;
}