簡體   English   中英

pthread_rwlock_rdlock 給出了奇怪的 errno?

[英]pthread_rwlock_rdlock gives weird errno?

我正在調用pthread_rwlock_rdlock() ,但由於某種原因失敗了。 我嘗試打印errno並得到:

錯誤號 = 25。

奇怪的是,在errno itselt 之后,我正在打印它的含義,我得到:

設備的 ioctl 不合適。

根據errno.h

#define ENOTTY      25  /* Not a typewriter */

所以出了點問題。

我的打印參數是:

 errno, strerror(errno)

我真正的錯誤是什么?

如果 pthread 服務正常,則返回 0,如果它們是 KO,則返回錯誤代碼。 因此,您應該在變量中獲取 function 的結果並顯示相應的錯誤消息:

int rc = pthread_rwlock_rdlock(...);

if (rc != 0) {
  fprintf(stderr, "Error %s (%d)\n", strerror(rc), rc);
}

根據pthreads的手冊,據說errno不是服務設置的。 錯誤代碼是一個返回值:

Pthreads function 返回值
大多數 pthreads 函數在成功時返回 0,在失敗時返回錯誤號。 可以返回的錯誤號與常規系統調用和C庫函數在errno中返回的錯誤號含義相同。 請注意,pthreads 函數不會設置 errno。 對於每個可以返回錯誤的 pthreads 函數,POSIX.1-2001 指定 function 永遠不會因錯誤 EINTR 而失敗。

關於ENOTTY錯誤代碼對應的消息,實際上在 C 庫的內部表中定義的消息與 header 文件的注釋中公開的消息之間存在差異。 由於歷史原因,Linux 設備驅動程序在傳遞無效操作碼(而不是ENOSYSEINVAL例如)時返回ENOTTY 因此,C 庫已經演變為為ENOTTY顯示更有意義的錯誤消息:

Inappropriate ioctl for device

代替:

$ cat /usr/include/asm-generic/errno-base.h | grep ENOTTY
#define ENOTTY      25  /* Not a typewriter */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM