2014-04-03 22 views
5

Natknąłem się na poniższy kod.Czy wartość zwracana przez IOCTL:

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

moje pytania są następujące:

  1. Does IOCTL zawsze zwraca '0' na sukces?
  2. W jaki sposób następujące wyrażenie ma wartość dodatnią/PRAWDA?

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

jaki sposób powyższe wyrażenie oceniać true dla niezerowej wartości zwracanej ioctl?

+2

1) Nie. Przeczytaj to: http://man7.org/linux/man-pages/man2/ioctl.2.html 2) Wartość "prawda", jeśli "ioctl" zwraca wartość inną niż 0. – AntonH

+0

@AntonH Powinieneś opublikować jako odpowiedź :) –

+1

@JesusRamos Powinienem, ale ponieważ jest to krótka/szybka odpowiedź, myślę, że to trochę marnowanie odpowiedzi. Tęskniłem za tak dużą renomą: D – AntonH

Odpowiedz

6

Do dewelopera, który opracuje sterownik, który obsługuje to żądanie, należy zwrócić jaką wartość, aby powrócić do sukcesu. Zwykle 0 oznacza, że ​​wszystko poszło dobrze. Ta konwencja była używana w systemach UNIX przez długi czas.

W każdym razie przeczytaj dokumentację dotyczącą tego konkretnego deskryptora pliku i dowiedz się, jakie wartości zwracają określone wywołania systemowe obsługiwane przez ten deskryptor pliku.

Jeśli chodzi o drugie pytanie, operator = zwraca nową wartość zmiennej po przypisaniu. Tak więc wartość zwracana (w naszym przypadku int dla ioctl) wyrażenia jest oszacowana niejawnie na true, jeśli operator przypisania przydzieli inną niż zero wartość.

Większość sposobów niezerowych wartości ujemne oznacza błędne wykonanie. W niektórych przypadkach wywołania systemowe systemu UNIX zwracają wartości dodatnie, jak robią to wywołania systemowe read lub write. W przypadku wywołań systemowych read i write ich dodatnia wartość zwracana oznacza liczbę bajtów, które zostały przeczytane lub zapisane.

Możliwe jest mieć ioctl powrotną pozytywną wartość, która może oznaczać, że wykonanie poszło normalnie i wracamy trochę stan o cokolwiek stoi ten konkretny deskryptor pliku dla. Ponownie przeczytaj uważnie swoją dokumentację.

więc w poniższym kodzie:

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

niezerową wartość oceniana jest na true i wjeżdżamy że warunkowy blok kodu.