Есть ли способ отправить сигнал процессу (в Linux), что приводит к завершению процесса после прохождения «atexit-функций» (в этом случае : void shutdownEngines()
)? Использование «pkill name» не работает.Завершение работы программы с вызовами функций atexit (Linux)
#include <cstdlib>
void shutdownEngines() {/*is not executed by "pkill name"*/}
int main() {
atexit(shutdownEngines);
while(true)
doStuff();
}
Использование: В настоящее время я программирую робота. Каждый раз, когда я хочу его протестировать, я запустил программу и завершил ее с помощью «pkill name
», но «shutdownEngines
» не вызывается, и робот продолжает двигаться, падая со стола и т. Д.
Я знаю, что могу сделайте «pkill name; ./shutdownEngines.sh
», но в моем случае это будет очень плохой стиль (номера контактов gpio, подключенных к движкам, определены в файле заголовка основной программы (исходный код основной программы не принадлежит роботу, но на моем компьютере). Убедившись, что всегда есть программа «shutdownEngines.sh
»/скрипт с правильными штырей на каждом роботе будет очень сложным.
Update
Следующий код работает отлично:
#include <iostream>
#include <csignal>
#include <cstdlib>
void signalHandler(__attribute__((unused)) const int signum) {
exit(EXIT_FAILURE);
}
void driverEpilog() {
std::cout << "shutting down engines...";
//drv255(0,0);
}
int main() {
signal(SIGTERM, signalHandler);
atexit(driverEpilog);
while(true)
system("sleep 1");
}
Это поможет вам, если вы привыкнете читать страницу руководства. –
Когда вы отправляете сигнал процессу (по умолчанию), процесс умирает без прохождения 'exit()', поэтому процедуры, зарегистрированные с помощью 'atexit() 'не вызываются. Вам придется написать обработчик сигнала, который проходит через 'exit()' - который не поддерживается стандартом C, и даже POSIX официально не разрешает его (см. [Как избежать использования 'printf()' в обработчик сигнала] (http://stackoverflow.com/questions/16891019/)) - главным образом потому, что нет контроля над функциями, выполняемыми в обработчиках 'atexit'. –
http://stackoverflow.com/questions/7376228/linux-c-catching-kill-signal-for-graceful-termination – Cyclonecode