signal
- 功能:注册信号处理函数(捕获信号)
- 原型:
typedef *void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- 参数:
1)signum:要捕获的信号,例:SIG_INT, SIG_TSTP
2)handler:一个函数,例:void handler(int signo)
a.SIG_IGN:忽略
b.SIG_DFL:默认行为 - 返回值:
成功:返回原来的信号处理函数
失败:返回SIG_ERR, 并设置 errno - 注意事项
不能被捕获:SIGKILL,SIGSTOP - DO
#include <func.h>
void handler(int signo) {
switch (signo) {
case SIGINT:
printf("Caught SIGINT\n");
break;
case SIGTSTP:
printf("Caught SIGTSTP\n");
break;
default:
printf("Unknown %d\n", signo);
}
}
int main(int argc, char* argv[]) {
sighandler_t oldhandler = signal(SIGINT, handler);
if (oldhandler == SIG_ERR) {
error(1, errno, "signal %d", SIGINT);
}
oldhandler = signal(SIGTSTP, handler);
if (oldhandler == SIG_ERR) {
error(1, errno, "signal %d", SIGTSTP);
}
while (1) {}
return 0;
}
#include <func.h>
int main(int argc, char* argv[]) {
printf("pid = %d\n", getpid());
sighandler_t oldhandler = signal(SIGINT, SIG_IGN);
if (oldhandler == SIG_ERR) {
error(1, errno, "signal SIGINT");
}
sleep(5);
printf("Wake up\n");
signal(SIGINT, SIG_DFL);
while (1) {}
return 0;
}
#include <func.h>
void handler(int signo) {
switch (signo) {
case SIGKILL:
printf("Caught SIGKILL\n");
break;
case SIGSTOP:
printf("Caught SIGSTOP\n");
break;
}
}
int main(int argc, char* argv[]) {
printf("pid = %d\n", getpid());
sighandler_t oldhandler = signal(SIGKILL, handler);
if (oldhandler == SIG_ERR) {
error(0, errno, "signal SIGKILL");
}
oldhandler = signal(SIGSTOP, handler);
if (oldhandler == SIG_ERR) {
error(0, errno, "signal SIGSTOP");
}
while (1) {}
return 0;
}