Ваша программа работает именно так, как вы ожидаете:
$ 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
.
С точки зрения процесса особой разницы нет. SIGKILL
завершает процесс немедленно и без вопросов (, если может ).
Однако окружающая среда — это совсем другое дело. Рассмотрим запись на диск. Процесс вызывает write()
, и в случае успеха ответственность передается операционной системе. Уничтожение процесса теперь не приводит к потере записанных данных, это задача ОС гарантировать это. Но данные по-прежнему небезопасно хранятся в постоянном хранилище, так как ОС могла не отправить их на диск или диск не записал их в постоянное хранилище.
Отключение питания всей системы приведет к уничтожению всех -кешей памяти ОС (, поэтому у вас обычно должен быть ИБП для обеспечения корректного завершения работы ), а также любой энергозависимый кеш. на запоминающем устройстве (, поэтому у дорогих вещей есть собственные батареи ).
Принудительное завершение работы ВМ было бы где-то посередине. Если супервизор ВМ умирает, все, что находится внутри него, теряется. Но все, что уже отправлено в хост-систему, должно быть в безопасности.
Насколько важна разница, зависит от вашего сценария (и оценки риска ). Если вы тестируете базу данных низкого уровня -, которая должна быть устойчивой к аппаратным сбоям, то тестирование путем фактического отключения может оказаться очень важным. Но если вы тестируете приложение более высокого уровня -, которое использует базу данных, имеющую дело с подобными вещами, вам, вероятно, не нужно тестировать все это самостоятельно.
Хотя я ожидаю, что все серьезные приложения для работы с базами данных, по крайней мере, попытаются справляться с перебоями в подаче электроэнергии, SQLite, в частности, содержит ряд статей, описывающих, что они делают для этого, см., например,.https://www.sqlite.org/atomiccommit.htmlи https://www.sqlite.org/howtocorrupt.html.
Примечание. :Я сказал "если сможет" о SIGKILL. В зависимости от ОС могут быть сценарии, в которых SIGKILL не может завершить процесс. Например. на линуксе,процессы в состоянии «непрерывного сна» (D )не умирают до того, как разрешится то, чего они ждут. См., например.:Что делает программа, когда ей посылается сигнал SIGKILL? и Как убить задачу, которую нельзя убить (непрерывно?)