Мне нужно реализовать поведение по умолчанию для вызова exit. Я не знаю, что мне делать и каков наилучший способ сделать это. Я прочитал, что он должен закрыть файловые дескрипторы и что-то еще. Должен ли я закрывать потоки по умолчанию (stdout, err и in)? Как выйти из вызовов вложенных функций? Использование goto - плохая практика, какой лучший способ вырваться? Благодарю.
Выполните все действия, перечисленные в exit(3)
, затем вызовите системный вызов _exit(2)
. В качестве альтернативы, используйте longjmp(3)
чтобы вернуться к функции main()
, а затем вернитесь от него. Это вызывает то же поведение, что и вызов exit(3)
, и так же зависит от времени выполнения C, поэтому, если exit(3)
недоступен по какой-либо причине, возврат из main()
, вероятно, тоже не будет корректным.
К сожалению, в AFAIK нет переносного способа перечисления всех функций, которые могли быть зарегистрированы с помощью atexit(3)
и on_exit(3)
, поэтому вам придется отслеживать их вручную (т.е. каждый раз, когда вы вызываете atexit(3)
или on_exit(3)
, добавьте указатель на список). Flushing stdio(3)
- 3 простых вызова fflush(3)
.
Вам не нужно закрывать потоки или файловые дескрипторы; ОС должна делать это автоматически (ОС не должна течь потоками и fd, поэтому она отвечает за их очистку).
NB: longjmp()
почти всегда ошибочен в C++; вместо этого выведите исключение. Он обычно должен использоваться только под прямым C.