SIGKILL против отключения питания

Ваша программа работает именно так, как вы ожидаете:

$ cat prog.c
int main()
{
    return 1;
}
$ cc prog.c
$./a.out
$ echo $?
1

Обратите внимание, что если вы что-то сделаете в -между запуском вашей программы и выводом $?, значение $?будет перезаписано статусом выхода -команд, которые вы используете. Например,

$./a.out
$ echo "I ran the program"
I ran the program
$ echo $?
0

Здесь 0— это статус выхода echo.

0
14.04.2021, 16:15
1 ответ

С точки зрения процесса особой разницы нет. SIGKILLзавершает процесс немедленно и без вопросов (, если может ).

Однако окружающая среда — это совсем другое дело. Рассмотрим запись на диск. Процесс вызывает write(), и в случае успеха ответственность передается операционной системе. Уничтожение процесса теперь не приводит к потере записанных данных, это задача ОС гарантировать это. Но данные по-прежнему небезопасно хранятся в постоянном хранилище, так как ОС могла не отправить их на диск или диск не записал их в постоянное хранилище.

Отключение питания всей системы приведет к уничтожению всех -кешей памяти ОС (, поэтому у вас обычно должен быть ИБП для обеспечения корректного завершения работы ), а также любой энергозависимый кеш. на запоминающем устройстве (, поэтому у дорогих вещей есть собственные батареи ).

Принудительное завершение работы ВМ было бы где-то посередине. Если супервизор ВМ умирает, все, что находится внутри него, теряется. Но все, что уже отправлено в хост-систему, должно быть в безопасности.

Насколько важна разница, зависит от вашего сценария (и оценки риска ). Если вы тестируете базу данных низкого уровня -, которая должна быть устойчивой к аппаратным сбоям, то тестирование путем фактического отключения может оказаться очень важным. Но если вы тестируете приложение более высокого уровня -, которое использует базу данных, имеющую дело с подобными вещами, вам, вероятно, не нужно тестировать все это самостоятельно.

Хотя я ожидаю, что все серьезные приложения для работы с базами данных, по крайней мере, попытаются справляться с перебоями в подаче электроэнергии, SQLite, в частности, содержит ряд статей, описывающих, что они делают для этого, см., например,.https://www.sqlite.org/atomiccommit.htmlи https://www.sqlite.org/howtocorrupt.html.

Примечание. :Я сказал "если сможет" о SIGKILL. В зависимости от ОС могут быть сценарии, в которых SIGKILL не может завершить процесс. Например. на линуксе,процессы в состоянии «непрерывного сна» (D )не умирают до того, как разрешится то, чего они ждут. См., например.:Что делает программа, когда ей посылается сигнал SIGKILL? и Как убить задачу, которую нельзя убить (непрерывно?)

5
28.04.2021, 22:52

Теги

Похожие вопросы