Инициируйте чистое завершение приложения C на Linux - PullRequest
1 голос
/ 29 марта 2019

Можно ли вызвать «чистое» завершение приложения, написанного на C, в системе Linux?Под «чистым» я имею в виду решение для деинициализации интерфейсов и т. Д. Как деструктор объекта в C ++, но для моего приложения на C.

Я знаю, что возможно отключить службы с помощью systemd,но мое приложение не является услугой.Я использую systemd.service для запуска моего приложения, но само приложение, насколько я понимаю, службы systemd, считается однократным (вначале происходит инициализация, а затем он входит в цикл while (1)).

Можно ли выйти из цикла с помощью systemd или аналогичной функциональности Linux?Каково «стандартное» решение такой проблемы?

int main (int argc, char **argv){
  // ... some initialization
  printf("Warming up!\n);

  while(keepRunning){
    // do stuff
    printf("Running!!\n");
  }
  // de-initialize
  printf("By by\n");
}

Я ожидаю, что systemd изменит значение keepRunning на 0. Но я думаю, что это будет слишком просто.

1 Ответ

0 голосов
/ 29 марта 2019
  • Установите обработчики сигналов (без флага SA_RESTART в их сигмации .sa_flags) для сигналов, которые должны убить приложение, не пропуская код очистки.
  • Сделайте так, чтобы обработчики сигналов установили атомарный флаг / sig_atomic_t (или сбросьте ваш флаг keepRunning, но обычно наоборот, чтобы вы могли использовать его для записи номера сигнала).
  • Когда вы получаете EINTR или в любое другое время, осмотрите флаг и начните сбой, если он установлен. (т. е. начать возвращать возвращаемые значения, сигнализирующие об ошибке, если в C, или, может быть, выдать исключение в C ++.)
...