Если то, что я пытаюсь сделать, не является хорошей идеей или не поддерживается, дайте мне знать. Я пытаюсь использовать различные системные библиотеки (libc.so.6
, libpthread.so.0
и т. Д.) Для API. API будет вызывать эти библиотеки для доступа к open()
, `close () и т. Д.
Я не уверен, что буду обрабатывать errno при сбоях, возвращая -1, вместо того, чтобы возвращать errno напрямую. Когда я вызываю close()
в libc.so.6
, он возвращает -1 в случае сбоя, поэтому я могу обнаружить произошедшую ошибку. Однако я не могу найти в libc какой-либо механизм, который позволяет мне запрашивать текущее значение errno, которое могло быть установлено предыдущим вызовом функции в том же потоке. Это не проблема при вызове функций pthread, потому что они напрямую возвращают значение errno, и я могу с этим работать.
Есть ли способ определить текущее значение errno для данного потока после выполнения функции, которая установила бы errno (например, close()
), используя какой-либо вызов библиотеки?
Возможные решения:
Я мог бы написать библиотеку-оболочку, которая вызывает close()
и т. Д. Запрашивает errno в состоянии ошибки и напрямую возвращает errno, но я стараюсь избегать включения пользовательских библиотек, которые должны быть включены в API.
Если есть способ вызвать стандартную библиотеку, это было бы идеально.
errno
является локальной для потока, а не глобальной. - person Jonathan Leffler   schedule 19.01.2017errno
доступен глобально для каждого потока. Таким образом, вам не нужна никакая библиотечная функция, чтобы получить ее значение. Просто:r = some_libc_function(); if (r==-1) last_errno = errno;
- person kaylum   schedule 19.01.2017get_errno
или аналогичную, которая просто возвращает значение (или адрес)errno
. В качестве альтернативы вы можете использовать функцию__errno_location
, которая является серверной частьюerrno
в glibc, но это не будет переносимым дизайном. - person R.. GitHub STOP HELPING ICE   schedule 19.01.2017dlsym()
? Или я предполагаю, что проблема в том, что вам нужна уже открытая библиотека в списке времени выполнения изображения ... - person clearlight   schedule 19.01.2017errno
- это локальный символ потока, а не глобальный символ, поэтому у него нет адреса как такового - только смещение в локальной секции потока. По историческим причинам он часто не реализуется просто как локальный для потока символ с именемerrno
, поэтому вы не можете просто объявить это, даже если ваш компилятор поддерживает локальные для потока символы. - person Chris Dodd   schedule 19.01.2017#define errno (*(___errno()))
- person myaut   schedule 19.01.2017errno
- это макрос, а не какой-либо внешний объект, поэтому вы не можете ожидать, что для него будет символ. Есть ли уerrno
адрес - открытый вопрос: см. stackoverflow.com/questions/12945486/is-errno-legal -c - person R.. GitHub STOP HELPING ICE   schedule 19.01.2017errno
может быть макросом, а может и не быть - разные реализации различаются. Вы можете полагаться на то, что он является единственным lvalue для любого конкретного потока, поэтому вы можете получить его адрес для потока, этот адрес будет стабильным для этого потока. - person Chris Dodd   schedule 19.01.2017