Реализация функции выхода по умолчанию

0

Мне нужно реализовать поведение по умолчанию для вызова exit. Я не знаю, что мне делать и каков наилучший способ сделать это. Я прочитал, что он должен закрыть файловые дескрипторы и что-то еще. Должен ли я закрывать потоки по умолчанию (stdout, err и in)? Как выйти из вызовов вложенных функций? Использование goto - плохая практика, какой лучший способ вырваться? Благодарю.

  • 0
    «Как выйти из вызова вложенных функций» - что вы подразумеваете под этим? И да, вы должны закрыть все файловые дескрипторы.
  • 1
    «поведение выхода по умолчанию» - вы ссылаетесь на atexit () ? Вы говорите о C ++ или C? Я думаю, что вам может понадобиться предоставить больше контекста.
Показать ещё 2 комментария
Теги:
system-calls
exit

1 ответ

0
Лучший ответ

Выполните все действия, перечисленные в 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню