2015-12-07 2 views
0

Как я могу сделать безопасную перезагрузку, например команду оболочки reboot с C без exec? Функция перезагрузки в reboot.h небезопасна. Он не синхронизирует и не пробуждает никаких отключений и безопасного завершения процесса. Какая функция имеет волшебный параметр?Безопасная перезагрузка Linux в C

Bet считает

+0

Я ставлю «много» или «добро». –

+1

Вы знаете, что все системные команды в Linux доступны с открытым исходным кодом и есть источник, доступный для кого-либо для изучения? Это означает, что вы можете узнать, из какого пакета появляется команда 'reboot', найти источник и точно посмотреть, что он делает. –

+2

Почему вы хотите перезагрузиться без каких-либо 'exec'? –

ответ

1

В самом деле, существуют системы, в которых перезагрузка выполняется должным образом не размонтирования разделов, вызывая ошибки файловой системы. Например, Android только форсирует файловую систему для установки только на чтение (по issuing Команда «u» на sysrq-trigger). Если вы не сосредоточены на производительности, и вы хотите, а система будет отключение чисто, не быстро, то вам необходимо выполнить следующие шаги:

  • Стоп основной init петлю. Существует не один метод для этого, и это зависит от того, что именно init реализация вашей системы. Вам нужно остановить основной цикл init, потому что вы не хотите, чтобы init перезапустил процессы, которые вы начнете убивать на следующем шаге.
  • Выдать сигнал «остановить» ко всем процессам, чтобы позволить им закончить свои действия.
  • Если «остановка» занимает слишком много времени, выдайте сигнал «убить» всем процессам. Перед размонтированием вы не хотите иметь процессы с открытыми файлами.
  • Размонтируйте все разделы только для чтения
  • Задать ядро ​​выключать машину путем выдачи перезагрузка стандартного вызова.

Все вышеуказанные шаги, которые вы можете сделать из C-кода, используя вызовы как kill, umount, reboot.

Как я уже говорил, Android не лучший пример с точки зрения чистого выключения, но вы можете взглянуть на пример реализации завершения кода C-кода here.

Смежные вопросы