LINUX.ORG.RU

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


0

0

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

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

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

anonymous
()

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

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

anonymous
()

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

man atexit

man _atexit

BaT ★★★★★
()

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

Привет! Спасибо за ответы. Увы, но Робачевского у меня нет. Есть только "Системное программирование на 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
() автор топика

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

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

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