LINUX.ORG.RU

Как отловить выход консольного приложения?


0

0

Привет! С недавних пор программирую под Solaris. Возникла следующая проблема: написано консольное приложение по передаче сообщений по сокетам. Перед завершением программы желательно послать другой программе сообщение об отключении. Как отловить момент завершения моей программы? Заранее благодарен за ответ.

точно не помню, но есть функция exit или _exit, которая вызывается в Linux при завершении программы. Т.е. можно написать обработчик завершения программы. Я могу ошибаться... посмотри Робачевского...

anonymous
()

Смотря что считать "моментом завершения" - понятие растяжимое. Если приложение снимается не по SIGKILL, а другим сигналом можно написать свой обработчик (man sigset). В котором через сокеты (вау :) послать сообщение другой программе. Если она завершается сама (естественным путем, так сказать, выходит ;) то вообще какие могут быть проблемы?

anonymous
()

man atexit

man _atexit

BaT ★★★★★
()

Привет! Спасибо за ответы. Увы, но Робачевского у меня нет. Есть только "Системное программирование на C++ для UNIX" Теренса Чана, однако того, что мне надо, я там не нашел. Возможность использования atexit попробовал, но эта функция отрабатывает при корректном выходе из программы - после вызова функции exit или после return-а. Однако проблема в том, что основную часть работы в программе осуществляют потоки, и функция main()не должна в это время кушать процессорное время и прочие полезные ресурсы ;-) Нашел пример интересного кода: int main(void) { sigset_t mask, oldmask; bool usr_interrupt; usr_interrupt = false; sigemptyset (&mask); sigaddset (&mask, SIGTERM); sigprocmask (SIG_BLOCK, &mask, &oldmask); while (!usr_interrupt) sigsuspend (&oldmask); sigprocmask (SIG_UNBLOCK, &mask, NULL);

// здесь надо бы послать сообщение о закрытии приложения puts("EXIT!"); } но пресловутый EXIT! так и не получил ни по SIGTERM, ни по SIGINIT (по нажатию Ctrl - C). Запускается все это дело в окне "RUN", в котором есть меню Window->Close (Alt + F4). Данным меню и закрываю свое приложениею Вопросы: 1. Какой сигнал в этом случае получаю? Как это определить? 2. Может можно как-то поставить орбработчик на выбор данного меню? 3. Если это все-таки SIGKILL, то как с ним бороться? Благодарю за ответ тех, кто мне уже отвечал и тех, кто еще ответит!

Cyberpunk
() автор топика

можно сделать следующее : вызвать процесс по fork, а самому wait пока он не завершится, а когда он завершится надо и посылать мессагу. сист. вызовы wait, fork, главное не запутайся где вызывающий процесс. Ему возвращается ненулевой PID потомка, потомку же нулевой PID.

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