signal

2018-01-08  本文已影响0人  thebeeman

信号:

信号是组概念,发送方和接收方需要配对存在,比如进程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);

}

上一篇下一篇

猜你喜欢

热点阅读