![](/img/trans.png)
[英]pthread_rwlock_rdlock() and pthread_rwlock_wrlock()
[英]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 設備驅動程序在傳遞無效操作碼(而不是ENOSYS或EINVAL例如)時返回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.