Является ли возвращаемое значение IOCTL

Я наткнулся на следующий код.

if((error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)))
{
      return EXIT_FAILURE;
}

Мои вопросы следующие:

  1. Всегда ли IOCTL возвращает «0» в случае успеха?
  2. Как следующее выражение оценивается как положительное / TRUE?

    (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context))
    

Как приведенное выше выражение оценивается как истинное для ненулевого возвращаемого значения ioctl?


person liv2hak    schedule 03.04.2014    source источник
comment
1) Нет. Прочтите это: man7.org/linux/man-pages /man2/ioctl.2.html 2) Возвращает значение true, если ioctl возвращает значение, отличное от 0.   -  person AntonH    schedule 04.04.2014
comment
@AntonH Вы должны опубликовать как ответ :)   -  person Jesus Ramos    schedule 04.04.2014
comment
@JesusRamos Я должен, но, поскольку это такой короткий / быстрый ответ, я думаю, что это пустая трата времени. Я теряю столько репутации :D   -  person AntonH    schedule 04.04.2014
comment
@AntonH - как (2) становится истинным, если ioctl возвращает ненулевое значение?   -  person liv2hak    schedule 04.04.2014
comment
Поскольку в C 0 ложно, все остальное верно.   -  person AntonH    schedule 04.04.2014


Ответы (1)


Это зависит от разработчика, который разрабатывает драйвер, который обрабатывает этот ioctl запрос, какое значение возвращать в случае успеха. Обычно 0 означает, что все прошло правильно. Это соглашение долгое время использовалось в системах UNIX.

В любом случае, прочитайте вашу документацию по этому конкретному файловому дескриптору и узнайте, какие значения возвращают определенные системные вызовы, которые обрабатываются этим файловым дескриптором.

Что касается второго вопроса, оператор = возвращает новое значение переменной после присваивания. Таким образом, возвращаемое значение (которое в нашем случае равно int вместо ioctl) выражения оценивается неявно как true, если оператор присваивания возвращает ненулевое значение.

В большинстве случаев ненулевые отрицательные значения означают ошибочное выполнение. В некоторых случаях системные вызовы UNIX возвращают положительные значения, как это делают системные вызовы read или write. В случае системных вызовов read и write их положительное возвращаемое значение означает количество прочитанных или записанных байтов.

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

Итак, в приведенном ниже коде:

if (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)) {
        return EXIT_FAILURE;
}

ненулевое значение оценивается как true, и мы вводим этот условный блок кода.

person mesmerizingr    schedule 03.04.2014