信号处理

一、基本概念

  1、中断分为软件中断和硬件中断

  2、信号是一种软件中断,是进程与进程,进程与内核的一种通信方式

  

3、常见的信号

SIGINT(2)

中断中断信号Ctrl+c
SIGQUIT(3) 终端退出信号Ctrl+
SIGABRT(6) 调用abort函数产生的信号
SIGFPE(8) 算术信号
SIGKILL(9) 死亡信号
SIGSEGV(11) 段错误信号
SIGALRM(14) 闹钟信号
SIGCHLD(17) 子进程结束信号
SIGCONT(18) 进程继续信号
SIGSTOP(19) 进程暂停信号
SIGTSTP(20) 终端停止信号

  4、编号小于SIGRGMI(34)的信号都是不可靠信号,不支持排队,因此接收时可能会丢失

  5、编号位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号,此种信号支持排队,不会丢失

二、signal

1 typedef void (*sighandler_t)(int);
2 sighandler_t signal(int signum, sighandler_t handler);
3 功能:向内核注册一个信号处理的函数
4     signum:信号的编号,可以直接写数字,也可以用系统提供的宏
5     handler:函数指针
6         SIG_DFL    恢复信号默认的处理方式
7         SIG_IGN    忽略信号
8     返回值:是之前信号的处理方式
9         函数指针、SIG_DFL、SIG_IGN、SIN_ERR

三、信号的发送

  1、由硬件产生的软件信号,如:键盘Ctrl+c,Ctrl+,Ctrl+z,

  2、错误产生的信号,如:非法访问内存,除0,硬件总线

  3、命令产生的信号,如:kill,killall

  4、函数产生的信号

    

1     int kill(pid_t pid,int sig);
2     功能:向指定的进程发送信号
3         pid:与watipid一样
4         sig:信号
5     0 表示空信号,不会向进程发送信号,但是会测试是否能向进程发送信号,这样可以检测一个进程是否存在,返回-1,表示进程不存在,errno为ESRCH
6     返回值:-1,说明进程不存在
7                 
8     int raise(int sig);
9     功能:向自己发送信号

四、睡眠函数

 1     int pause(void);
 2     功能:休眠
 3     进程调用了pause函数后会进入睡眠状态,直到有信号把他叫醒(不被忽略的信号)
 4     pause函数要么不返回(一直睡眠),要么返回-1
 5 
 6     unsigned int sleep(unsigned int seconds);
 7     功能:使用调用的进程睡眠seconds秒
 8     调用sleep的进程如果没有睡眠足够的秒数,除非收到信号后才会返回
 9     sleep的返回值是0,或剩余的秒数
10         
11     int usleep(useconds_t usec);
12     功能:睡眠usec微秒
13 
14     unsigned int alarm(unsigned int seconds);
15     功能:定时一个闹钟信号
16     让内核向调用它的进程,在seconds秒后发送一个 SIGALRM(14)信号    
17     SIGALRM信号的默认处理方式是直接退出

五、信号集和信号屏蔽

 1 a、信号集
 2     int sigemptyset(sigset_t *set);
 3     功能:清空信号集
 4 
 5     int sigfillset(sigset_t *set);
 6     功能:填满信号集
 7 
 8     int sigaddset(sigset_t *set, int signum);
 9     功能:向信号集中添加信号
10 
11     int sigdelset(sigset_t *set, int signum);
12     功能:从信号集中删除信号
13         
14     int sigismember(const sigset_t *set, int signum);
15     功能:测试一个信号集中是否存在某个信号
16 b、屏蔽信号集中的信息
17     int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
18     功能:设置进程的信号掩码(信号屏蔽码)
19         how:修改信号掩码的方式
20                 SIG_BLOCK 向信号掩码中添加信号,并集(以信号集的方式添加)
21                 SIG_UNBLOCK 从信号掩码中删除信号,补集的交集
22                 SIG_SETMASK 用新的信号集替换旧的信号掩码
23         newset:新添加、删除、替换的信号集,也可以为空
24         oldset:获取旧的信号掩码
25         当newset为空时,就是在备份信号掩码
26 c、sigpending
27     int sigpending(sigset_t *set);
28     功能:获取未决状态的信号

六、信号处理函数

 1     int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
 2     功能:设置或获取信号处理
 3 
 4     struct sigaction {
 5         void (*sa_handler)(int);//信号处理函数指针
 6         void (*sa_sigaction)(int, siginfo_t *, void *);//信号处理函数指针
 7                             int signum:信号码
 8                             siginfo_t* info:系统自带结构体
 9                             void* ptr:保留
10         sigset_t sa_mask;//信号屏蔽码
11         int sa_flags;
12                 SA_NOCLDSTOP:SIGSTOP,SIGTSTP,SIGTTIN、SIGTTOU 子进程停止,忽略SIGCHLD信号
13                 SA_NODEFER/SA_NOMASK:在处理信号时不屏蔽信号
14                 SA_RESETHAND:处理完信号后,恢复系统默认处理方式
15                 SA_RESTART:当信号处理函数中断了系统调用,则重启系统调用
16                 SA_SIGINFO:用sa_sigaction处理信号
17         void (*sa_restorer)(void);//保留(NULL)
18     };
19 
20     int sigqueue(pid_t pid, int sig, const union sigval value);    
原文地址:https://www.cnblogs.com/xkk956227639/p/9368336.html