产生信号的条件:
1. 按某些中断按键时,Ctrl + C
2. 硬件异常,除0操作
3. 用户调用 kill
4. 定时器超时 SIGALRM
信号处理
1. 忽略信号
大多数信号都可忽略,除了SIGKILL和SIGSTOP, 这两个提供了进程终止的可靠方法
2. 捕捉信号
3. 执行系统默认动作 大多数信号的系统默认动作是终止该进程
终止进程以后,有可能生成.core文件,该文件用来检查进程终止时的状态
后面该书列出了很多信号比如SIGTRAP,SIGSTOP,介绍了对应的功能,暂不考虑
10.3 函数sxignal
void (*signal(int signo, void (* func)(int))) (int);
signo是信号名,比如SIGSTOP
func的值是常量SIG_IGN(ignore 忽略该信号)、SIG_DFL(default 系统默认处理方式) 或者接收到信号后要调用的函数地址. 如果是函数地址,则在信号发生时调用该函数,该函数被称为signal handler
#include "apue.h"
static void sig_usr(int); /* one handler for both signals */
int
main(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; )
pause();
}
static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
err_dump("received signal %d\n", signo);
}
运行上述函数(位置在apue/signals/sigusr.c),可得如下结果:
./a.out & 表示在后台运行a.out,否则前台运行会占用shell,我们无法继续执行其他shell
看到268页,程序启动那一章,看不下去了,,,,