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);
}
}