LINUX.ORG.RU

Не очень понятно, что значит "закрытие".

При нажатии на Ctrl-C программа получает SIGINT (и по умолчанию умирает).

При закрытии терминала, в котором работает программа, программа получает SIGHUP (и по умолчанию умирает).

При выполнении kill PID программа получает SIGTERM (и по умолчанию умирает).

Поставь обработчики на соответствующие сигналы - и сможешь обрабатывать эти события.

execve
()
Ответ на: комментарий от execve

Да все верно... поставить обработчики с помощью glib функций или posix?
Если ф-ий glib то какие? (желательно примерчик ;))

Замечу еще раз что программа кроссплатформенная должно работать под linux/win

Mrak ★★★
() автор топика
Ответ на: комментарий от Mrak

> Да все верно... поставить обработчики с помощью glib функций или posix?

С помощью функций posix (signal/sigaction).

> Замечу еще раз что программа кроссплатформенная должно работать под linux/win

Используя один и тот же код для обеих платформ? Сомнительно как-то.

execve
()

портабельно: atexit/g_atexit 

int normal_exit_flag=0;

void normal_exit(int code) {
  normal_exit_flag=1;
  exit(code);
}

void atexit_handler() {
  //cleanup
  //...
  if (!normal_exit_flag) {
    fprintf(stderr,"Ох ёоо..\n");
  }
}

int main() {
  atexit(atexit_handler);
  sleep(10);
  normal_exit(0);
}

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> портабельно: atexit/g_atexit 

Что то не получается :( Под линуксом срабатывает normal_exit &
 atexit_handler создавая файл "222"... 
Когда в консоле нажимаю Ctrl+C или подругому прерываю программу
ф-ия atexit_handler не срабатывает :(


#include <glib.h>
#include <stdio.h>
#include <stdlib.h>

GMainLoop *main_loop;
int normal_exit_flag=0;

void normal_exit(int code) {
  normal_exit_flag=1;
	g_printf("Normal exit...\n");
	g_main_destroy(main_loop);
  exit(code);
}

void atexit_handler() {
  //cleanup
  //...
  if (!normal_exit_flag) {
    fprintf(stderr,"Oh ooo...\n");
		system("touch 111");
  }
	else{
		g_printf("Abort exit...\n");
		system("touch 222");
	}
}


void main()
{
	main_loop = g_main_new(TRUE);
	gint i;
	system("rm -f 111");
	system("rm -f 222");
	g_atexit(atexit_handler);
	for(i=0;i<10;i++){
		g_printf("Sec: %d\n",i);
  	g_usleep(1*G_USEC_PER_SEC);
	}
	normal_exit(0);	
}

Mrak ★★★
() автор топика
Ответ на: комментарий от Mrak

тут уже ситемо-зависимые вещи пошли :) надо-же объяснить программе, что SIGTERM это нормально и по нему надо выходить через exit(3) :)

то есть для Linux и вообще *nix систем надо перехватить-таки сигналы SIGTERM, SIGHUP и SIGINT и вызвать в них exit..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

exit() нельзя звать из обработчика сигнала, т.к. она не async-signal-safe, а async-signal-safe _exit() не вызывает обработчик atexit.

Бугага вобщем. Проще вообще не завязываться на atexit.

execve
()
Ответ на: комментарий от execve

>exit() нельзя звать из обработчика сигнала, т.к. она не >async-signal-safe, а async-signal-safe _exit() не вызывает обработчик >atexit.

нельзя. В обрабботчике еще много чего нельзя. Зато можно в обработчике выставить флаг (глобальная переменная), в цикле ее проверять, если флаг установлен - exit();

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Если есть флаг "двери закрываются" и единая точка, через которое проходит завершение программы, то atexit тем более не нужен.

execve
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.