Bootstrap

Linux下信号函数signal使用

  在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)手工操作方式

信号说明
SIGHUP1终端挂起,关闭SSH打开的终端即可
SIGINT2CTRL+C
SIGQUIT3Ctr+\
SIGKILL9强制结束,不能捕获
SIGCHLD17子进程终止信号,用法参考之前的文章,Linux下fork函数使用及僵尸进程处理: https://blog.csdn.net/weixin_43628270/article/details/117077871.

在运行signal 的终端上Ctr+\后输出
在这里插入图片描述
新打开终端后执行kill -s 9 9258强制结束,不能捕获,输出
在这里插入图片描述

;