2012-12-13 75 views
1

是POSIX,在設備驅動程序讀取函數中返回errno.h中列出的任何可用的errno值,還是應該使用在讀取linux手冊頁中列出的值?是否有任何errno是read()的有效POSIX返回值?

編輯:
我正在寫一個設備驅動程序,其中用戶必須在調用read函數之前使用ioctl cmd設置一些參數。所以我正在尋找正確的errno值來返回,如果用戶在設置這些參數之前嘗試調用read函數。 EPERM「操作不允許」似乎很重要,但因爲它沒有列在讀取Linux手冊頁中,所以我想知道這是否是正確的實現。

+0

我想如果你解釋你在做什麼會更好,否則看起來不是一個真正的問題。 –

回答

1

Linux的聯機手冊通常很不錯,但它們不具有權威性。對於這樣的問題,你需要去官方標準。您應該只返回POSIX.1-2008 specification for read中列出的錯誤代碼之一(向下滾動至錯誤位置)。如果您返回其他代碼,應用程序軟件將無法處理它並可能崩潰。

請注意,其中許多代碼可能會只有在他們描述的條件下返回。例如,您的設備驅動程序沒有任何業務返回EBADF,EISDIR,EOVERFLOW,ESPIPE或其描述中包含單詞「套接字」的任何事物,因爲在控制權到達您之前,將處理那些適當的失敗代碼的所有情況。這可能是也是EINTR的情況,但我不確定。

你也應該知道,Linux並沒有實現POSIX.1-2008的一些可選功能(最重要的是這裏假裝所有標記爲OB_XSR的東西都不存在),而且一些區別標準過時(例如ENOMEMENOBUFS)。

全部放在一起,除非你的設備驅動程序是非常不尋常的,我想你應該只需要EIOEAGAINENOMEM,並也許ENXIO(如果EIO/ENXIO區別是有意義的硬件)。

+0

好的,就我而言,ENXIO看起來更好「一個請求超出了設備的功能。」 – Adrien

+1

是的,或者 - 儘管它不在列表中 - 「EINVAL」是一種通用的「你只是試圖做的沒有任何意義」的代碼,應用軟件通常*準備應付。絕對不要使用'EPERM';這是保留給特權檢查,它不是一個設備驅動程序的工作強制執行,無論如何,他們發生在「開放」,而不是「讀」。 – zwol

+1

[POSIX說](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_03)*實現...可能會產生額外的錯誤,除非明確禁止某個特定的函數。*和' read()'不明確地禁止這個。應該編寫可移植程序以期望POSIX錯誤列表不是完整的。 – caf

2

POSIX要求列出的錯誤代碼用於報告相應的錯誤情況。但是,它也允許其他錯誤代碼用於未列出的錯誤。

text從POSIX.1-2008第2卷:系統接口,第2.3節的錯誤編號:

實施方式可以支持不包括在此 列表的附加誤差,可能會產生包括在情況下該列表錯誤 除了這裏描述的那些,或可能包含擴展或限制,以防止發生一些錯誤。

每個參考頁面上的錯誤部分指定哪些錯誤 條件由所有實現被檢測(「應失敗」) 並且其可以由實現方式(「可以 失敗」)任選地被檢測到。如果沒有檢測到錯誤情況,則所請求的動作應該成功 。

實現可以產生下不同於所描述 情況這裏列出錯誤編號,當且僅當所有這些 錯誤條件總是可以被同樣地處理到誤差 條件如在本體積POSIX.1-2008的說明。 對於本卷的POSIX.1-2008中描述的錯誤條件 ,實現不應從本卷所需的一個 生成一個不同的錯誤編號,但可能會生成其他 錯誤,除非明確禁止某個特定錯誤功能。

相關問題