2014-04-03 64 views
5

我遇到以下代碼。是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的一個非零的返回值?

+2

1)否閱讀:http://man7.org/linux/man-pages/man2/ioctl.2.html 2)如果'ioctl'返回的值不是0,則評估爲「真」。 – AntonH

+0

@AntonH你應該張貼作爲一個答案:) –

+1

@JesusRamos我應該,但因爲它是如此短/快速的答案,我認爲這是一個有點答案的浪費。我錯過了很多聲望:D – AntonH

回答

6

它是由開發商誰開發的驅動程序負責處理此ioctl請求返回成功什麼樣的價值。通常,0表示一切正常。這個約定很長一段時間以來一直在UNIX系統中使用。

總之,看了你的關於這個特殊的文件描述符的文件,並知道什麼值由該文件描述符返回處理特定的系統調用。

至於第二個問題,=運算符返回變量的分配之後的新值。因此,如果賦值運算符返回非零值,則表達式的返回值(在我們的示例中爲intioctl)將被隱式評估爲true

很多方面,非零值意味着錯誤的執行。在某些情況下,當系統調用readwrite時,UNIX系統調用會返回正值。在readwrite的情況下,系統調用它們的正返回值意味着讀取或寫入的字節數。

有可能使ioctl返回正值,這可能意味着執行正常進行,並且我們返回某些狀態,無論該特定文件描述符是什麼。再次仔細閱讀文檔。

因此,在下面的代碼:

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

非零值被評估以true和我們進入的代碼,條件塊。