在Linux后台开发过程中,经常会处理中断信号来决定是否关闭后台程序,所以简单整理了一下signal函数,代码如下:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
//gcc signal.c -o signal
//信号处理函数,其中signum为信号值
void SignalProc(int signum)
{
FILE *out = fopen("./signal.log","a+");
switch (signum) {
case SIGHUP:
printf("Get a signal -- SIGHUP\n");
fprintf(out,"Get a signal -- SIGHUP \n");
break;
case SIGINT:
printf("Get a signal -- SIGINT\n");
fprintf(out,"Get a signal -- SIGINT \n");
break;
case SIGQUIT:
printf("Get a signal -- SIGQUIT\n");
fprintf(out,"Get a signal -- SIGQUIT \n");
break;
case SIGKILL:
printf("Get a signal -- SIGKILL\n");
fprintf(out,"Get a signal -- SIGKILL \n");
break;
default :
printf("Get a signal -- %d\n",signum);
fprintf(out,"Get a signal -- %d \n",signum);
break;
}
fclose(out);
return;
}
int main() {
printf("process id is %d\n",getpid());
//下面设置四个信号的处理方法
signal(SIGHUP, SignalProc);
signal(SIGINT, SignalProc);
signal(SIGQUIT, SignalProc);
signal(SIGKILL, SignalProc);
//保持程序不退出,真实后台应用可以根据信号处理函数保存信号值来判断是否退出
for (;;) ;
}
1、编译:gccgcc signal.c -o signal
2、运行:./signal
3、查看信号值:kill -l
4、测试
(1)kill -s sigspec方式,如发送SIGHUP,则kill -s 1 进程ID
新打开终端后执行kill -s 1 9258后输出
(2)手工操作方式
信号 | 值 | 说明 |
---|---|---|
SIGHUP | 1 | 终端挂起,关闭SSH打开的终端即可 |
SIGINT | 2 | CTRL+C |
SIGQUIT | 3 | Ctr+\ |
SIGKILL | 9 | 强制结束,不能捕获 |
SIGCHLD | 17 | 子进程终止信号,用法参考之前的文章,Linux下fork函数使用及僵尸进程处理: https://blog.csdn.net/weixin_43628270/article/details/117077871. |
在运行signal 的终端上Ctr+\后输出
新打开终端后执行kill -s 9 9258强制结束,不能捕获,输出