Лучшая замена для exit (), atexit () в C - PullRequest
6 голосов
/ 08 марта 2019

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

каков наилучший из возможных способов завершения процесса

  1. Если используется однопоточный режим, просто используйте exit(), так как ваш код не будет многопоточным
  2. В противном случае убедитесь, что все потоки, кроме одного, закончились до последнего потока, а затем безопасно вызовите exit() из-за 1. выше.
2 голосов
/ 08 марта 2019

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

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

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

...