2014-04-03 17 views
5

Mi sono imbattuto nel seguente codice.È il valore restituito IOCTL

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

Le mie domande sono le seguenti:

  1. fa IOCTL restituisce sempre '0' in caso di successo?
  2. In che modo la seguente espressione viene valutata su un valore positivo/VERO?

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

modo l'espressione di cui sopra valutare a true per un valore di ritorno diverso da zero di ioctl?

+2

1) No. Leggi questo: http://man7.org/linux/man-pages/man2/ioctl.2.html 2) Valuta su "true" se "ioctl" restituisce un valore diverso da 0. – AntonH

+0

@AntonH Dovresti postare come risposta :) –

+1

@JesusRamos Dovrei, ma visto che è una risposta così breve/rapida, penso che sia un po 'uno spreco di risposta. Mi manca così tanta reputazione: D – AntonH

risposta

6

Spetta allo sviluppatore che sviluppa driver che gestisce questa richiesta ioctl quale valore restituire in caso di successo. Solitamente, 0 significa che tutto è andato bene. Questa convenzione è stata utilizzata per molto tempo nei sistemi UNIX.

In ogni caso, leggere la documentazione relativa a questo particolare descrittore di file e sapere quali valori particolari chiamate di sistema gestite da questo ritorno del descrittore di file.

Per quanto riguarda la seconda domanda, l'operatore = restituisce un nuovo valore di variabile dopo l'assegnazione. Pertanto, il valore restituito (che nel nostro caso è ioctl) per l'espressione viene valutato in modo implicito in true se l'operatore di assegnazione restituisce un valore diverso da zero.

La maggior parte dei modi, non pari a zero valori negativi significa esecuzione errata. In alcuni casi, le chiamate di sistema UNIX restituiscono valori positivi come le chiamate di sistema read o write. In caso di chiamate di sistema read e write, il loro valore di ritorno positivo indica il numero di byte letti o scritti.

E 'possibile avere ioctl ritorno valore positivo che può significare che l'esecuzione è andato normalmente e torniamo un po' stato di tutto ciò che questo particolare descrittore di file rappresenta. Ancora una volta, leggi attentamente la tua documentazione.

Così, nel seguente codice:

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

valore diverso da zero viene valutata per true ed entriamo quel blocco condizionale di codice.