2016-11-06 44 views
1

如果我想使用可能返回錯誤的函數,例如thread_mutexattr_init(& myAttr),如果此函數返回一個錯誤,它將自動設置errno爲錯誤的編號,還是應該設置errno到這個函數的返回?瞭解C中的errno

例如什麼是正確的呢?

if((errno = pthread_mutexattr_init(&myAttr)) != 0){ 
    if(errno == EBUSY){ 
     perror("some error message because of EBUSY"); 
    }else{ 
     perror("another error message"); 
} 

或者這樣:

if(pthread_mutexattr_init(&myAttr) < 0){ 
    if(errno == EBUSY){ 
     perror("some error message because of EBUSY"); 
    }else{ 
     perror("another error message"); 
    } 
} 

回答

3

第一個版本是正確的出了兩(第二個是錯的其實 - pthread_mutexattr_init()需要在成功或失敗正誤差數返回零;它是未定義爲設置errno,因此errno中的值不一定相關)。

POSIX不要求並行線程函數來設置errno(他們可能會或可能不會設置 - 有沒有要求)。返回的值本身就是錯誤號。如果返回值是0那麼成功,如果它是其他任何你可以把它分配給errno查找錯誤(或使用任何其他int變量來保存的值,然後傳遞到strerror(),例如)。

+0

雖然POSIX標準並沒有說pthread的功能從設置'errno'禁止的['errno']的定義(http://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html )說:errno'的'_The值應只對函數的調用,這就是它明確規定後,設置定義... _和[''(http://pubs.opengroup.org/onlinepubs/9699919799 /basedefs/errno.h.html)表示:_The''頭應定義下面的宏其中應擴展到整數類型'int'常量表達式,不同正值(除了下面指出的)... _ –

+0

由於'pthread_mutexattr_init( )'沒有被定義爲設置'errno',所以在調用之後檢查'errno'是不允許的(明智的)。函數永遠不會返回負數:成功時返回0,失敗時返回正整數。 –