2015-05-22 33 views
0

我試圖讀取read()上運行良好的open()返回的文件描述符,但它只是不起作用返回22errnoread():無效的參數

下面是代碼:

int input = open(argv[1], O_RDONLY|O_DIRECT); 
char buffer_header[4]; 
if(read(input,buffer_header,4) > 0) 
    image_width = bytesToInt(buffer_header); 
printf("%d\n",errno); 

發生了什麼事是,在read()條件不匹配。難道我做錯了什麼?返回的文件描述符是3

+0

'errno'纔有效,如果出現了錯誤。你沒有得到一個錯誤。 – Barmar

+0

'read()'返回-1,如果我在'if'structure中添加'printf()',它不會打印任何內容。 – Marc

回答

1

如果read返回-1以表明它出現錯誤,則應該只檢查errno

int n; 
if ((n = read(input, buffer_header, 4)) > 0) { 
    image_width = bytesToInt(buffer_header); 
} else if (n == -1) { 
    perror("read"); 
} else { 
    printf("EOF\n"); 
} 
+0

返回:'read:無效參數' – Marc

+0

唯一可能的解釋是'input'不是有效的描述符。 – Barmar

+0

我該如何檢查它是否不是?目前'input'是'3'。 – Marc

4

我認爲這可能與做你的if語句存在> 0

這裏的read手冊頁說的話(男子2型讀取終端):

RETURN值 成功時,將返回讀取的字節數(零表示文件結束),文件位置按此數字提前。如果 這個數字小於請求的字節數,則不是錯誤;這可能發生,例如因爲現在實際上可用的字節更少(可能因爲 我們接近文件結束,或者因爲我們正在從管道讀取數據或從終端讀取數據),或者因爲read()被中斷一個信號。 出錯時,-1是 返回,並且適當地設置了errno。在這種情況下,未指定文件位置(如果有)是否發生更改。

所以,你的代碼應該讀一些類似

if(-1 == read(input,buffer_header,4)) { 
     perror("error with read"); 
    } else { 
     do something; 
    } 

編輯:對不起,剛纔看到的評論感謝Barmar!編輯2:同樣你應該錯誤地檢查系統調用open

int input = open(argv[1], O_RDONLY|O_DIRECT); 
if(-1 == input) { 
    perror("error with open"); 
} else { 
    do stuff; 
} 

Here's一個簡短的教程,可以幫助

+0

爲什麼當它返回'-1'時要做些什麼? – Barmar

+0

哎呦!翻轉他們。 – cdixit2

+0

'open()'似乎工作得很好,'讀取錯誤'返回。 – Marc