信号
是在生活中随处可见的,他的特征是简单,不携带大量信息,满足条件后才会触发。
信号机制
就是利用信号是进程之间联系。内核是用来负责信号的产生和发送的
如何产生信号
- 按键产生
- 系统调用产生
- 软件条件产生
- 硬件异常产生
- 命令产生
信号的处理方式
- 捕捉:获得信号
- 忽略:跳过信号
- 按照系统命令处理:终止程序
查看所有信号选项
Kill -l
信号四要素
- 编号,每个信号都有自己的编号,相当于身份证
- 名称,每个信号都有自己的名字,相当于姓名
- 事件,信号执行的动作
4.系统默认动作
- Term:终止进程。
- lgn:忽略信号 (默认即时对该种信号忽略操作)。
- Core:终止进程,生成Core文件。(查验进程死亡原因,用于 gdb调试)。
- Stop:停止(暂停)进程。
- Cont:继续运行进程。
函数
设置计时器函数
alarm:
int alarm(int seconds);
参数:定时秒数
setitimer:
int setitimer(int which,struct itimerval *new_value, struct itimerval
*old_value)
参数:
- which,指定定时方式
自然定时:ITIMER_REAL 计算自然时间。
虚拟空间计时(用户空间)::ITIMER_VIRTUAL 只计算进程占用cpu的时间。
运行时计时(用户+内核)::ITIMER_PROF 计算占用cpu及执行系统调用的时间。
- new_value:定时秒数
struct itimerval {
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec: /* microseconds */
}it_interval;
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec: /* microseconds */
}it_value;
}
- old_value:传出参数,上次定时剩余时间,可设为NULL
信号集操作函数
//清空set
int sigemptyset(sigset_t *set);
//置1 set
int sigfillset(sigset_t *set);
//把某个信号加入到 set
int sigaddset(sigset_t *set, int signum);
//把某个信号从set中移除
int sigdelset(sigset_t *set, int signum);
//查看某个信号,是否在set中
int sigismember(const sigset_t *set, int signum);
sigprocmask:用来设置屏蔽信号——只是将信号延后处理,而非忽略
int(int how,sigset_t *set, sigset_t *oldset)
参数:
how:SIG_BLOCK:阻塞
SIG_UNBLOCK:非阻塞
SIG_SETMASK:自定义
set:自定义信号集
old:旧有的信号集
sigpending:读取当前进程的未决信号集
int (sigset_t *set)
参数:set传出未决信号集
信号捕捉函数
typedef void (* sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
sigaction 修改信号函数
int sigaction(int signum, struct sigaction *act, struct sigaction
*oldact);
参数
act:传入参数,新的处理方式。。
oldact:传出参數,旧的处理方式
struct sigaction {
void (*sa_handler)(int); 捕捉函数后进行的动作
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask; 屏蔽的函数
int sa_flags; 一般设为0
void (*sa_restorer )(void);
};
SIGCHLD信号
SIGCHLD的产生条件
- 子进程终止时
- 子进程接收到SIGSTOP信号停止时。
- 子进程处在停止态,接受到SIGCONT后唤醒时。