Intereting Posts
Найти или создать конфигурацию ядра двоичного кода ядра Самый быстрый способ найти и заменить строку в многочисленных файлах HTML Член группы не может отображать файлы в каталоге, сделанные группой Удалить символ ^ M из файлов журнала Автоматическое подключение к Интернету при запуске в OpenBSD? Перенаправить субдомен на сайт https Выделить файл с определенным смещением в ext3 / 4 Абсолютно не удается получить доступ к FTP после добавления многих правил в iptables в CentOS5 Как удалить повторяющиеся числа в столбце в файле? Остановить обработку одной строки в awk после успешного совпадения? Как полностью отключить обмен? Измените запрос Korn, чтобы показать более короткий путь для рабочего каталога mv `Список аргументов слишком длинный` для одного файла начиная с последней строки, обрабатываемой при обработке файла журнала несколько раз Самый надежный способ проверки подключенного клиента?

Лучший способ создания «прерывистого» исполняемого файла

Работа моего исполняемого файла Unix состоит в том, чтобы выполнить длинное вычисление, и я добавил ему функцию прерывания / возобновления, как описано ниже.

С регулярными интервалами программа записывает все соответствующие данные, найденные до сих пор в файле контрольной точки, которые затем могут использоваться в качестве отправной точки для операции «возобновить».

Чтобы прервать программу, я использую Ctrl + C.
Единственная проблема с этой методологией заключается в том, что если прерывание происходит, когда программа записывает в файл, у меня остается бесполезный наполовину написанный файл.

Единственное исправление, которое я смог найти, заключается в следующем:

  • сделать программу
  • пишите в два файла, так что во время перезапуска один из них будет доступен для чтения.

Есть ли более чистый, лучший способ создать «прерывистый» исполняемый файл Unix?

Это немного зависит, если вы заботитесь только о самой ошибке программы или сбое всей системы.

В первом случае вы можете записать свежие данные в новый файл, а затем переименовать их в настоящее имя только после того, как вы закончите писать. Таким образом, файл будет содержать либо предыдущие, либо новые данные контрольной точки, но не только частичную информацию. Хотя частичная запись должна быть достаточно редкой в ​​любом случае, если мы предположим, что сам код контрольной точки вряд ли потерпит неудачу, и если соответствующие сигналы пойманы в ловушку, чтобы убедиться, что программа полностью сохраняет новую контрольную точку перед выходом. (В дополнение к SIGINT , я думаю, вам лучше поймать SIGHUP и SIGTERM тоже.)

Если мы рассмотрим возможность сбоя всей системы, я бы не доверял только одному файлу контрольной точки. Данные вряд ли будут на самом деле находиться на диске, когда система вернется из системного вызова записи файла. Вместо этого ОС и сам диск, скорее всего, будут кэшировать данные и фактически записать их через некоторое время. Таким образом, оставляя один или два предыдущих контрольных пункта, будут работать как отказоустойчивые против этого.

Вы можете поймать сигнал SIGINT который отправляется процессу при Ctrl-C с помощью обработчика сигналов. Затем процесс немедленно не убивается, а обработчик сигнала вызывается. В обработчике сигнала вы можете записать результаты в файл. Это общая идея, на практике у вас могут быть более тонкие детали, чтобы позаботиться.