Linux进程的几种死法

Linux进程正常退出,可以通过在main()函数里面return,或调用exit(),或调用abort().

除去代码之外,Linux还定义了如下几个signal,进程在收到这些signal后,会执行一些规定的动作再退出.

SIGINT:  Ctrl和C的组合键会产生该signal,进程收到后直接退出;

SIGQUIT: Ctrl和\的组合键会产生该signal,进程收到后生成核心转储文件,然后退出;

SIGTERM: kill pid或killall name会产生该signal,进程在收到该信号后,可以做一些释放资源的动作,然后退出;

SIGKILL: kill -9 pid或killall -9 name产生该signal.必杀信息,进程不能忽略,不能改变信息默认动作.收到信号,直接退出.

以上四个信号,除SIGKILL之外,其余三个均可以注册自定义的信号处理函数.如下面这段示例代码,在收到SIGINT, SIGQUIT, SIGTERM后,除了打印一句LOG外,什么也没做,改写了信号对应的默认行为.这个进程就只能使用 kill/killall -9 生成SIGKILL退出了.

death_signal.c:

#include <signal.h>
#include <stdio.h>

static void sigHandler(int sig)
{
    switch(sig) {
		case SIGINT:
			printf("SIGINT is caught.\n");   /* printf() is not safe in signal handler. */
			break;
		case SIGQUIT:   /* Generally, we should not catch this signal. */
			printf("SIGQUIT is caught.\n");
			break;
		case SIGTERM:
			printf("SIGTERM is caught.\n");
			break;
		default:
			printf("Unknow signal\n");
			break;
	}      
}

int main(int argc, char *argv[])
{
    int i;

	/* Ctrl+C: the normal mode. */
    if (signal(SIGINT, sigHandler) == SIG_ERR) {
		printf("register handler for SIGINT fail\n");
		return -1;
	}

	/* Ctrl+\: used when program in endless loop or abnormal mode. */
    if (signal(SIGQUIT, sigHandler) == SIG_ERR) {
		printf("register handler for SIGQUIT fail\n");
		return -1;
	}

	/* kill pid or killall name: free all resouces in sigHandler. */
	if (signal(SIGTERM, sigHandler) == SIG_ERR) {
		printf("register handler for SIGTERM fail\n");
		return -1;
	}

	/* 
     * kill -9 pid will produce SIGKILL signal.
     * User program can't ignore or handle this signal.
     */
    if (signal(SIGKILL, sigHandler) == SIG_ERR) {
		printf("register handler for SIGKILL fail\n");
	}

    for (i = 0; ; i++) {
        printf("%d\n", i);
        sleep(3); 
    }
}




猜你喜欢

转载自blog.csdn.net/weixin_42263483/article/details/80808012