2014-01-30 2 views
2

Как приложение может обнаружить, что оно только что закончилось? Могу ли я использовать обработчик сигналов для этого?Как обнаружить завершение программы в C/Linux?

+0

да, если это не прекращается по сигналу Kill. Взгляните на «сигнал» в руководстве ('man signal') – BRFennPocock

+0

Вместо этого вы должны использовать' sigaction', поскольку он более портативен. –

ответ

0

Включить atexit(). Он вызывается функцией, когда программа прерывается нормально.

Пример кода:

#include <stdio.h>  
#include <stdlib.h>  
void funcall(void); 
void fnExit1 (void) 
{ 
    printf ("Exit function \n"); 
} 

int main() 
{ 
    atexit (fnExit1); 
    printf ("Main function start\n"); 
    funcall(); 
    printf ("Main function end\n"); 
    return 0; 
} 

void funcall(void) 
{ 
    sleep(2); 
    exit(0); 
} 

Выход:

Main function start 
Exit function 
+0

Atexit() запускается после того, как все потоки в приложении завершены? –

+0

@ LunarMushrooms Да – sujin

0

Вы могли бы попробовать --->int raise (int sig)

И когда ручка SIGTERM или SIGKILL поднимается !!

+0

Я хочу поймать самоограничение (не только по запросу другого процесса). Например, Ctrl + \, Ctr + C или assert, сбой и т. Д. Таким образом, SIGTERM и SIGKILL не являются единственными сигналами, которые необходимо обработать. Мне нужно одно место, где я могу справиться со всеми делами. –

0

Вы также можете зарегистрировать функцию, которая будет вызываться при выходе из процесса. См. man atexit

0

Вы можете установить обработчик сигналов для SIGINT, SIGKILL и SIGSEGV. В обработчике сигнала вы можете взять дамп стека, чтобы позже вы могли отлаживать ваше приложение. В обработчике сигнала устанавливаются значения SIGINT, SIGKILL и SIGSEGV по умолчанию.

Смежные вопросы