Лучшая замена для exit(), atexit() в C

Я новичок в программировании на C. Раньше я думал, что использование exit() было самым чистым способом завершения процесса (поскольку он способен удалять временные файлы, закрывать открытые файлы, нормально завершать процесс...), но когда я попробовал команду man exit на терминале (Ubuntu 16.04.5, gcc 5.4.0) я увидел следующую строку:

Функция exit() использует незащищенную глобальную переменную, поэтому она не является потокобезопасной.

После этого я попытался провести небольшое исследование о лучшей замене exit() (чтобы с самого начала изменить свое поведение при программировании). При этом я столкнулся с этим вопросом, в котором упоминаются побочные эффекты exit() и предлагается правильно использовать atexit() для решения проблемы (хотя бы частично).

Были некоторые случаи, в которых использование abort() предпочтительнее exit(). Кроме того, этот вопрос предполагает, что atexit() также может быть вредным.

Итак, вот мои вопросы:

  • Есть ли какой-либо общий и лучший способ завершения процесса (который гарантированно очищает, как exit(), и в любом случае не наносит вреда системе)?
  • Если ответ на первый вопрос НЕТ!, каков наилучший способ завершения процесса (включая случаи, в которых они наиболее полезны)?

person Adhamzhon Shukurov    schedule 08.03.2019    source источник
comment
В современных защищенных системах, таких как Linux, macOS и Windows, большая часть ресурсов, выделяемых процессом, освобождается не exit, а самой операционной системой. И лучший способ не рисковать утечкой ресурсов — это по-прежнему убирать за собой: любой ресурс, который вы выделяете или создаете, вам нужно освободить, освободить или уничтожить перед возвратом из функции main.   -  person Some programmer dude    schedule 08.03.2019
comment
Когда вы начинаете писать многопоточные программы, самое время начать беспокоиться о (не-)безопасности потоков exit(). Более того, скептически относитесь к функциям обработчика выхода и atexit(). Кого на самом деле волнует, что exit() не является потокобезопасным, когда его результатом является завершение программы? Только при особых обстоятельствах — возможно, с участием atexit() — имеет смысл беспокоиться об этом.   -  person John Bollinger    schedule 08.03.2019
comment
Кроме того, если бы была общая потребность в чем-то лучше, чем exit(), такая функциональность существовала бы. Если бы были общие проблемы с exit(), их бы исправили.   -  person Andrew Henle    schedule 08.03.2019
comment
вызов free() для возврата виртуальной памяти в кучу в адресном пространстве, которое перестанет существовать, является пустой тратой времени, как процессорного, так и истекшего.   -  person    schedule 09.03.2019


Ответы (2)


как лучше завершить процесс

  1. Если вы используете однопоточность, просто используйте exit(), так как ваш код не будет многопоточным.
  2. В противном случае убедитесь, что все потоки, кроме одного, завершились до последнего потока, а затем безопасно вызовите exit() из-за 1. выше.
person alk    schedule 08.03.2019

Учитывая, что сбой питания/аппаратного обеспечения может произойти в любое время, невероятная... крайняя сложность надежного завершения потоков пользовательским кодом и хаотичный характер использования пулов памяти и т. д. во многих нетривиальных многопоточных приложениях, лучше спроектировать приложения и системы, которые могут очищать временные файлы и т. д. при запуске, а не пытаться микроуправлять завершением работы.

«Очистите все ресурсы, которые вы выделяете, прежде чем выйти» звучит как хороший совет в классе или на лекции, но быстро становится целой цепью альбатросов на шее, когда вы сталкиваетесь с дюжиной потоков, очередей и пулов в постоянно меняющейся динамической системе.

Если вы можете, если вы работаете под нетривиальной ОС, пусть она сделает свою работу и уберет за вас. Это намного лучше, чем ваш пользовательский код.

person Martin James    schedule 08.03.2019
comment
разрабатывать приложения и системы, которые могут очищать временные файлы и т. д. при запуске хорошая идея! Тем не менее, красивое и чистое завершение работы также должно быть частью дизайна приложения. Если это невозможно, что-то сломано. - person alk; 09.03.2019