nanorobot 2 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба Получает ли приложение, снимаемое командой killall какое либо извещение о том что оно сейчас будет снято, что бы можно было предпринять какие то дейставия - освободить динамическую память, закрыть порты и т.д. ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 28 октября, 2020 Опубликовано 28 октября, 2020 (изменено) · Жалоба killall шлет SIGTERM, его и надо ловить. Регистрируете функцию отлова с помощью signal, а дальше на что фантазия способна. Можно некую условную переменную в true ставить, где различные участки кода ее проверяют и корректно завершают свою работу. http://cppstudio.com/post/1204/ Изменено 28 октября, 2020 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 32 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба static void sig_handler(int sigio) { if (sigio == SIGQUIT) { ... } else if ((sigio == SIGINT) || (sigio == SIGTERM)) { ... } return; } int main(int argc, char **argv) { ... struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */ /* configure signal handling */ sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigact.sa_handler = sig_handler; sigaction(SIGQUIT, &sigact, NULL); /* Ctrl-\ */ sigaction(SIGINT, &sigact, NULL); /* Ctrl-C */ sigaction(SIGTERM, &sigact, NULL); /* default "kill" command */ ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 28 октября, 2020 Опубликовано 28 октября, 2020 (изменено) · Жалоба Почитайте man 7 signal и man 3 signal. Пишете обработчик, а в начале main регистрируете при помощи функции signal обработчик нужных сигналов. Вот так, например: https://github.com/eddyem/eddys_snippets/blob/master/guard.c#L49 Ну и не забывайте, что kill -9 или killall -9 посылает SIGKILL, который не может быть игнорирован. P.S. Память освобождать не нужно: ядро после смерти приложения это сделает само. Аналогично не нужно закрывать порты. А вот при работе с БД нужно правильно закрыть, чтобы снять блокировку, или уведомить подключенную железяку, что программа сдохла, или освободить область в разделяемой памяти и т.п... Изменено 28 октября, 2020 пользователем Eddy_Em Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 1 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба 8 hours ago, Eddy_Em said: который не может быть игнорирован Не может быть перехвачен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться