LINUX.ORG.RU

[x86_64/syscall/libc] переменная errno


0

1

В чем суть наличия этой переменной? Насколько я знаю, Linux syscall возвращает в %rax отрицательное значение этой переменной, если ядро обнаружило ошибку во время исполнения вызова. А затем врапер из стандартной библиотеки переносит это значение в потокозависимую переменную errno и возвращает -1.

Почему нельзя возвращать отрицательный номер ошибки, чтобы приложение самостоятельно анализировало возвращаемое значение?

Также, в одной из статей в сети нашел упоминание, что errno - это устаревший метод определения ошибок. У меня пока что опыт в программировании для Linux небольшой, но вроде других методов определения ошибок в C я не встречал, может чего упустил? Существуют ли другие методы, не основанные на этой глобальной переменной errno?


Ответ на: комментарий от mrs

> Совместимость именно с ранее написанным софтом, или еще с чем-то?

С посиксом же. В рамках которого, кстати, часть функций выдают ошибку в errno, а часть - преимущественно новые - возвращают -error.

const86 ★★★★★ ()
Ответ на: комментарий от const86

Со стандартом то всё понятно, я имею ввиду, что может быть существуют какие-либо особенности реализации взаимодействия ядра и программы, вследствие которых наличие глобальной переменной errno необходимо?..

Допустим, если чуток отойти от стандарта и заюзать, например, open, read/write, close (или другие сервисы) напрямую обращаюсь к ядру, то какие грабли следует ожидать, из-за того что переменная errno будет исключена из цепочки?

mrs ()
Ответ на: комментарий от mrs

errno собственно уже и не глобальная переменная, нити видят каждая свое значение, хотя в разных ОС это сделано по разному

io ★★ ()
Ответ на: комментарий от io

Угу, именно, для реализации этого механизма в многопоточном приложении уже нужен массив a_errno[n_threads]. Вот зачем его таскать с собой, если можно получить ошибку сразу после syscall?.. Все равно приходится все эти ошибки, в том или ином виде, обрабатывать самостоятельно. Смею предположить, что POSIX расширяет количество возможных значений errno, в случае если ошибки происходят в user space, но такие ошибки можно и непосредственно в приложении отследить, imho.

mrs ()
Ответ на: комментарий от mrs

то какие грабли следует ожидать, из-за того что переменная errno будет исключена из цепочки?

perror не будет работать, но для этого есть strerror.

Begemoth ★★★★★ ()
Ответ на: комментарий от Begemoth

в случае отладки, можно записать числовое значение в лог. все возможные ошибки, получаемые от ядра, находятся в файлах «asm-generic/errno.h» и «asm-generic/errno-base.h»

mrs ()
Ответ на: комментарий от Begemoth

> Ну и отдельный вопрос, какая часть посикса реализована в ядре, а какая - в glibc.

а что это меняет? по идее glibc изменяет переменную errno после того как ядро выполнило syscall. ядро не имеет прямого доступа к этой переменной и не зависит от его значения... или я не прав?

может быть изменяется как-либо образом внутреннее состояние glibc, в зависимости от полученного значения errno, или переменная нужна только для информирования приложения об ошибке?

mrs ()
Ответ на: комментарий от mrs

> от его значения поправлюсь, хотел сказать от её значения.

mrs ()
Ответ на: комментарий от mrs

> по идее glibc изменяет переменную errno после того как ядро выполнило syscall. ядро не имеет прямого доступа к этой переменной и не зависит от его значения...

да

const86 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.