Е IOCTL върната стойност

Попаднах на следния код.

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

Въпросите ми са следните:

  1. Винаги ли IOCTL връща '0' при успех?
  2. Как следният израз се оценява като положителен/ВЯРЕН?

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

Как горният израз се оценява като true за ненулева върната стойност на 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) се оценява на true, ако 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