信号:
信号是组概念,发送方和接收方需要配对存在,比如进程A发送信号X给进程B,进程B接收信号按信号处理函数进行响应,具体的处理流程是:
1.1 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。
1.2 该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。
1.3 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号给该进程)。
1.4 内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理,而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行。
2. 信号集有哪些?
kill -l && man 7 signal
3. 触发信号的常用操作
Ctrl-C SIGINT
Ctrl-\ SIGQUI
Ctrl-Z SIGTSTP
kill -l USERSIG PID
4. 相关AP
I//为信号设置处理方法
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);//sigprocmask, rt_sigprocmask - examine and change blocked signals
//为进程添加阻塞信号集,表示进程接收到其中的信号并不立即处理,而是等到进程解除阻塞后再处理
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);//添加信号到信号集中int sigaddset(sigset_t *set, int signum);//从信号集中删除信号int sigdelset(sigset_t *set, int signum);
//判断信号是否是信号集中元素?
int sigismember(const sigset_t *set, int signum);
5. struct sigaction之sa_mask与sa_mask
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);};
sa_mask是信号阻塞集sa_flags是信号修改标志
6. 代码
#include <stdio.h>
#include <signal.h>
void
main(int argc, char *argv[])
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sig_int_handler;
sigaction(SIGINT, &act, NULL);
sleep(3);
printf("Sample for signal programming end\n");
}
void
sig_int_handler(int signum)
{
printf("Got a signal of %d\n", signum);
}
网友评论