本文共 3003 字,大约阅读时间需要 10 分钟。
信号名称 | 说明 |
---|---|
SIGABORT | * 进程异常终止 |
SIGALRM | 超时警告 |
SIGFPE | * 浮点运行异常 |
SIGHUP | 连接挂断 |
SIGILL | * 非法指令 |
SIGINT | 终端中断 |
SIGKILL | 终止进程(此信号不能被捕获或忽略) |
SIGPIPE | 向无读进程的管道写数据 |
SIGQUIT | 终端退出 |
SIGSEGV | * 无效内存段访问 |
SIGTERM | 终止 |
SIGUSR1 | 用户定义信号 1 |
SIGUSR2 | 用户定义信号 2 |
SIGCHLD | 子进程已经停止或退出 |
SIGCONT | 继续执行暂停进程 |
SIGSTOP | 停止执行(此信号不能被捕获或忽略) |
SIGTSTP | 终端挂起 |
SIGTTIN | 后台进程尝试读操作 |
SIGTTOU | 后台进程尝试写操作 |
(‘ * ’ 表示:系统对信号的响应视具体实现而定)
#includevoid (*signal(int sig, void (*func)(int)))(int);
名称 | 说明 |
---|---|
SIG_IGN | 忽略信号 |
SIG_DEL | 恢复默认行为 |
/* test2.c */#include#include #include #include void handleSig(int);void main(){ printf("running...\n"); signal(SIGINT, handleSig); // 主进程循环,等待信号 while(1){ sleep(2); printf("alive.\n"); }}void handleSig(int sig){ printf("got signal: %d\n", sig); signal(SIGINT, SIG_DFL);}
运行程序,执行结果如下:
ubuntu@cuname:~/dev/beginning-linux-programming/test$ gcc -o test2 test2.cubuntu@cuname:~/dev/beginning-linux-programming/test$ ./test2running...alive.alive.^Cgot signal: 2 // 第一次 响应 SIGINT 终端中断信号:打印字符串alive.alive.^C // 第二次 响应,程序默认终止ubuntu@cuname:~/dev/beginning-linux-programming/test$
ubuntu@cuname:~/dev$ kill -sigint 38897
#include#include int kill(pid_t pid, int sig);
#includeunsigned int alarm(unsigned int seconds);
使用 alarm 函数,实现进程自我唤醒,代码如下:
#include#include #include void handleSig(int);void main(){ printf("main running...\n"); // 响应/处理 SIGALRM 闹钟信号 signal(SIGALRM, handleSig); // 闹钟倒计时 5 秒 alarm(5); // 暂停执行,等待被 SIGALRM 闹钟信号唤醒 pause(); printf("done.\n");}void handleSig(int sig){ printf("wake up.\n");}
执行结果如下(达到预期目的):
ubuntu@cuname:~/dev/beginning-linux-programming/test$ gcc -o test2 test2.cubuntu@cuname:~/dev/beginning-linux-programming/test$ ./test2main running...wake up. // 被 SIGALRM 闹钟信号唤醒done.
#includeint sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
sigaction 结构定义在文件 signal.h 中,它的作用是定义在接收到参数 sig 指定的信号后应该采取的行动。该结构至少应该包括以下几个成员:
void (*) (int) sa_handler sigset_t sa_mask int sa_flags转载地址:http://pclsi.baihongyu.com/