2016-01-24 23 views
7

errnoERANGE由POSIX記錄爲ERANGE和EOVERFLOW之間的語義區別是什麼?

結果太大。

EOVERFLOW記錄爲

值太大而不能存儲在數據類型。

這兩者之間的語義區別是什麼?特別是考慮到ISO 9899使用ERANGE(例如,在strtol中)使用了EOVERFLOW所述的語義。這兩個errno價值只有歷史原因明顯?

如果可能,請備份適當來源的論點。

+0

建議將「EOVERFLOW」的適當源文件返回爲「...」,因爲C11規範中的「ERANGE」和EOVERFLOW不是。 – chux

+0

@chux這就是爲什麼我說「由** POSIX **記錄爲」。具體頁面是[errno.h](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html) 。 ISO 9899沒有記錄「ERANGE」的含義。 – fuz

+0

我看到 - 沒有初始閱讀「由POSIX」申請到第二行。 - 當你發佈/評論時,肯定會閱讀。 – chux

回答

4

SingleUnix相當冗長約EOVERFLOW

值太大而不能存儲在數據類型的IPC或文件系統對象的用戶ID或組ID是太大而不能存儲到的適當構件調用者提供的結構。只有在支持更大範圍的用戶ID或組ID值的實現上,該錯誤纔會發生,比聲明的結構成員可以支持的範圍更大。這通常是因爲IPC或文件系統對象駐留在具有比本地系統更大的uid_t,off_t或gid_t類型值的遠程計算機上。

EOVERFLOW似乎是旨在信號的子系統不兼容,即,一些系統返回比另一個子系統可以處理更大的值。

EOVERFLOW是理explained in more detail

大多數的這個錯誤代碼的用途都涉及到大文件支持。通常情況下,這些情況發生在支持off_t不同大小的多種編程環境的系統上,但它們也可能與遠程文件系統相關。另外,當不同的編程環境對於諸如int和uid_t之類的類型具有不同的寬度時,幾個函數可能遇到特定環境中的值太寬以至於不能表示的情況。在這種情況下,應該提出這個錯誤。例如,假設當前正在運行的進程具有64位int,並且文件描述符9223372036854775807已打開,並且沒有設置close-on-exec標誌。如果進程使用execl()來執行在32位int編程環境中編譯的文件,則對execl()的調用可能會失敗,並將errno設置爲[EOVERFLOW]。如果任何用戶標識或任何要分配給新過程映像的組標識超出了執行文件編程環境的範圍,則execl()可能會發生類似的故障。

但是,請注意,對於明確描述爲始終成功的函數(如getpid()),不會出現此情況。

感謝@rici爲指針

ERANGE更像這永遠不會適合strtol()就是一個例子。另一個不太清晰的例子是:嘗試將SYSV信號量增加超過其配置的限制返回ERANGE

EOVERFLOW數據存在,它只是不適合本地數據結構。例如,lseek()可返回EOVERFLOW。發生這種情況當off_t只有32位,但文件系統可以支持更大的文件,並且您嘗試尋找操作系統可以處理的範圍。爲什麼不是這個ERANGE?由於系統原則上可以處理該操作,因此無法以可用的數據類型將其返回給您。

試圖在Linux上的32位系統上使用mmap()映射超過2G的數據返回EOVERFLOW(其他系統返回EINVAL)。

不幸的是,這不完全一致。例如,藍牙堆棧在系統中找到太多主機控制器時返回EOVERFLOW

+1

理由中還有更多解釋(http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html#tag_22_02_03),其中還注意到錯誤「ERANGE」被添加,因爲它被用於C標準。 64位可執行文件'execl'的基本原理示例是一個32位二進制文​​件,其中有一個未關閉的超出範圍的fd,這很吸引人。我不知道這是否會發生。 – rici

+0

@rici感謝您的參考,我將添加引用 – dhke

+0

@rici示例本身有點荒謬,但是可以發生的事情是人們試圖用打開的文件描述符來執行32位程序,並將其寫入系統上的大文件大文件僅用於64位程序。 – fuz

4

有一個語義差別:

EOVERFLOW用於情況下的緩衝器大小OS太小,並要求將溢出目標緩衝區的數據傳輸,或類似的錯誤條件:

http://man7.org/linux/man-pages/man2/open_by_handle_at.2.html

EOVERFLOW

  The handle->handle_bytes value passed into the call was too 
      small. When this error occurs, handle->handle_bytes is 
      updated to indicate the required size for the handle. 

http://man7.org/linux/man-pages/man2/open.2.html

EOVERFLOW

  pathname refers to a regular file that is too large to be 
      opened. The usual scenario here is that an application 
      compiled on a 32-bit platform without -D_FILE_OFFSET_BITS=64 
      tried to open a file whose size exceeds (1<<31)-1 bytes; see 
      also O_LARGEFILE above. This is the error specified by 
      POSIX.1; in kernels before 2.6.24, Linux gave the error EFBIG 
      for this case. 

ERANGE用於不適合在目標類型(C99)值以及針對特定命令(POSIX)

所定義的範圍之外的參數但它也用於出錯EOVERFLOW會更合適的錯誤:

http://man7.org/linux/man-pages/man3/pthread_setname_np.3.html

The pthread_setname_np() function can fail with the following error: 

ERANGE The length of the string specified pointed to by name exceeds 
      the allowed limit. 

    The pthread_getname_np() function can fail with the following error: 

    ERANGE The buffer specified by name and len is too small to hold the 
      thread name. 

我猜EOVERFLOW用於系統調用和ERANGE在C庫函數使用的標準,而不是。

相關問題