Понимание errno в C

Если я хочу использовать функцию, которая может возвращать ошибку, например thread_mutexattr_init(&myAttr), если эта функция возвращает ошибку, она автоматически установит errno с номером ошибки, или я должен установить errno для возврата этой функции?

Например, что правильно делать?

if((errno = pthread_mutexattr_init(&myAttr)) != 0){
    if(errno == EBUSY){
        perror("some error message because of EBUSY");
    }else{
        perror("another error message");
}

Или это:

if(pthread_mutexattr_init(&myAttr) < 0){
    if(errno == EBUSY){
        perror("some error message because of EBUSY");
    }else{
        perror("another error message");
    }  
}

person Daniel Oliveira    schedule 06.11.2016    source источник


Ответы (1)


Первая версия верна из двух (вторая на самом деле неверна - pthread_mutexattr_init() требуется для возврата нуля в случае успеха или положительного номера ошибки в случае неудачи; установка errno не определена, поэтому значение в errno не обязательно имеет значение).

POSIX не предписывает функциям pthreads устанавливать errno (они могут устанавливать или не устанавливать его - нет никаких требований). Само возвращаемое значение является номером ошибки. Если возвращаемое значение равно 0, то успех, а если это что-то еще, вы можете назначить его errno, чтобы найти ошибку (или использовать любую другую переменную int для хранения значения, а затем передать его, например, strerror()).

person P.P    schedule 06.11.2016
comment
Хотя стандарт POSIX не говорит, что функциям pthread запрещено устанавливать errno, определение <errno.h> говорит: Заголовок <errno.h> должен определять следующие макросы, которые должны расширяться до целочисленных константных выражений. с типом int, различные положительные значения (кроме указанных ниже)… - person Jonathan Leffler; 07.11.2016
comment
Поскольку pthread_mutexattr_init() не определено для установки errno, недопустимо (разумно) проверять errno после вызова. И функция никогда не возвращает отрицательное число: она возвращает 0 в случае успеха и положительное целое число в случае неудачи. - person Jonathan Leffler; 07.11.2016