中止当前只在执行的进程,而去执行其他的任务。中断分为两种:一种来自硬件设备的中断,另一种来自其他程序的中断。 信号是一种软中断,可以把他看作是进程与进程、内核与进程通信的一种方式。
编号小于SIGRGMI(34)的信号都是不可靠的,位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号。可靠信号支持排除,不会丢失。
1、忽略 2、终止 3、终止+core
core dump 把内存的使用情况扔出来。 core文件是一种二进制文件,需要一些高度工具才能解析出来(gdb)。 1、gcc -g code.c -> 生成带调试信息的可执行文件。 2、运行可执行文件产生core文件 3、gdb ./a.out core 程序会停止在产生错误的位置。屏蔽SIGINT信号
#include <signal.h> #include <stdio.h> void handler(int s) { printf("signal is %d\n", s); } int main() { sigset_t set; signal(SIGINT, handler); //把SIGINT信号准备屏蔽掉 sigaddset(&set, SIGINT); while(1); }控制台内容:
./a.out ^Csignal is 2ctrl+c之后程序并没有退出 而是输出了信号内容。
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 功能:设置或获取信号处理方式
struct sigaction { // 信号处理函数指针 void (*sa_handler)(int); // 信号处理函数指针 需要使用sigqueue发送信号 void (*sa_sigaction)(int, siginfo_t *, void *); // 信号屏蔽码 sigset_t sa_mask; int sa_flags; SA_NOCLDSTOP:忽略SIGCHLD信号 SA_NODEFER/SA_NOMASK:在处理信号时不屏蔽信号 SA_RESETHAND:处理完信号后,恢复系统默认处理方式 SA_RESTART:当信号处理函数中断的系统调用,则重启系统调用。 SA_SIGINFO:用sa_sigaction处理信号信号中附加数据:
#include <stdio.h> #include <signal.h> #include <unistd.h> void sigint(int signum,siginfo_t* info,void* ptr) { printf("收到信号%d,附加数据有:%d %d\n",getpid(),info->si_pid,info->si_int); } int main() { printf("%d\n",getpid()); struct sigaction act = {}; act.sa_sigaction = sigint; act.sa_flags = SA_SIGINFO; sigaction(SIGINT,&act,NULL); pause(); }输出结果:
./a.out 8323 ^C收到信号8323,附加数据有:0 2003799784