Действительно ли все коды ошибки системного вызова уникальны?

Я однажды записал сценарий для решения подобной проблемы - я звонил, это "распределяет" (можно прочитать основной код сценария или файла с сообщением справки, или загрузить его как пакет); из его описания:

распределите - Распределяют набор пакетов на нескольких CD (особенно хороший для будущего использования с APT)

Описание: 'распределите' программу, делает выполнение задач связанным с созданием набора CD для распределения набора пакетов легче. Задачи включают: разметка файловой системы CD (разделяющий большое количество пакетов в несколько дисков и т.д.), готовя набор к использованию APT (индексация), создание ISO-образов и запись дисков.

Периодические обновления первоначально распределенного набора могут быть выпущены со справкой, 'распределяют'.

Это делает целый процесс на нескольких этапах: однажды, это создает furure диск "разметки" при помощи символьных ссылок на исходные файлы - таким образом, можно вмешаться и изменить будущие дисковые деревья.

Детали о его использовании могут быть считаны в сообщении справки, распечатанном сценарием (или путем изучения исходного кода).

Это было записано с более более хитрым вариантом использования в памяти (выпускающий обновления как "разность" - набор добавленных новых файлов - к первоначально зарегистрированному набору файлов), таким образом, это включает один дополнительный начальный этап, а именно, "фиксируя" текущее состояние набора файлов (для простоты, это делает это путем тиражирования исходного набора файлов посредством символьных ссылок в специальном рабочем месте для сохранения состояний набора; затем, некоторое время в будущем, это сможет создать разность между будущим текущим состоянием набора файлов и этим сохраненным состоянием). Так, хотя Вам, возможно, не понадобилась бы эта функция, Вы не можете пропустить этот начальный этап, AFAIR.

Кроме того, я не уверен теперь (я записал это довольно много лет назад), обращается ли это со сложными деревьями хорошо, или это, как предполагается, разделяет только плоскость (один уровень) каталоги файлов. (Изучите сообщение справки или исходный код, чтобы быть уверенными; я буду искать это также немного позже, когда у меня будет некоторое время.)

Связанный с APT материал является дополнительным, не обращайте внимание, что это может подготовить наборы пакета, которые будут использоваться APT, если Вам не нужно это.

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

(Обратите внимание, что пакет включает дополнительные полезные патчи, не примененные в представленном листинге кода в Мерзавце repo связанный выше!)

2
21.03.2011, 00:23
3 ответа

Существует два аспекта: путями системные вызовы сигнализируют, что ошибка произошла, и о способе, чем произошла ошибка, сообщают.

Большинство системных вызовов сигнализирует, что ошибка произошла путем возврата-1, но это не абсолютно универсально (например, некоторые системные вызовы всегда успешны, например. getpid).

Если Вы знаете, что ошибка произошла, код ошибки всегда находится в errno¹. Существуют стандартные значения, определенные в errno.h, и каждый Unix варианты добавляет некоторых собственных. Коды ошибок известны константами, имя которых начинается E; числовые значения варьируются от ОС до ОС. Эти коды ошибок являются стандартными (например. EACCESS всегда означает “разрешение, отклоненное”, EIO всегда означает “ошибку ввода/вывода”, …), но что точно каждое средство сообщения об ошибке зависит от системного вызова.

Стандартные функции strerror и perror предоставьте сообщения об ошибках, что можно отобразиться пользователю.

¹ Примечание это, если никакая ошибка не произошла во время последнего системного вызова или вызова библиотечной функции C, errno может содержать мусор.

3
27.01.2020, 21:57

Единственные перекрытия, о которых я знаю, являются синонимами в областях, которые исторически отличались между AT&T и BSD-получили Unixes. Например, Unix AT&T EAGAIN означает то же самое как BSD's EWOULDBLOCK, таким образом, у них есть то же значение в системах, которые определяют обоих.

2
27.01.2020, 21:57

Нет, не должно быть никаких перекрытий в errno.h в данной системе. Проверьте Ваш errno.h (скорее всего, где-нибудь под/usr/include) для определяет запуск с E, как в ENOENT и такой, и делают a switch() оператор, обрабатывающий каждый случай. Затем можно вызвать собственную функцию для всех ошибок системного вызова.

(Звуки много как Вы реализуете perror(3).

0
27.01.2020, 21:57

Теги

Похожие вопросы