Я новичок в программировании на C. Раньше я думал, что использование exit()
было самым чистым способом завершения процесса (поскольку он способен удалять временные файлы, закрывать открытые файлы, нормально завершать процесс...), но когда я попробовал команду man exit
на терминале (Ubuntu 16.04.5, gcc 5.4.0) я увидел следующую строку:
Функция exit() использует незащищенную глобальную переменную, поэтому она не является потокобезопасной.
После этого я попытался провести небольшое исследование о лучшей замене exit()
(чтобы с самого начала изменить свое поведение при программировании). При этом я столкнулся с этим вопросом, в котором упоминаются побочные эффекты exit()
и предлагается правильно использовать atexit()
для решения проблемы (хотя бы частично).
Были некоторые случаи, в которых использование abort()
предпочтительнее exit()
. Кроме того, этот вопрос предполагает, что atexit()
также может быть вредным.
Итак, вот мои вопросы:
- Есть ли какой-либо общий и лучший способ завершения процесса (который гарантированно очищает, как
exit()
, и в любом случае не наносит вреда системе)? - Если ответ на первый вопрос НЕТ!, каков наилучший способ завершения процесса (включая случаи, в которых они наиболее полезны)?
exit
, а самой операционной системой. И лучший способ не рисковать утечкой ресурсов — это по-прежнему убирать за собой: любой ресурс, который вы выделяете или создаете, вам нужно освободить, освободить или уничтожить перед возвратом из функцииmain
. - person Some programmer dude   schedule 08.03.2019exit()
. Более того, скептически относитесь к функциям обработчика выхода иatexit()
. Кого на самом деле волнует, чтоexit()
не является потокобезопасным, когда его результатом является завершение программы? Только при особых обстоятельствах — возможно, с участиемatexit()
— имеет смысл беспокоиться об этом. - person John Bollinger   schedule 08.03.2019exit()
, такая функциональность существовала бы. Если бы были общие проблемы сexit()
, их бы исправили. - person Andrew Henle   schedule 08.03.2019