2016-11-06 3 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

2(第2は、実際に間違っているうちの最初のバージョンが正しいか - pthread_mutexattr_init()が成功または失敗した場合に正のエラー番号にゼロを返すために必要であり、それはerrnoを設定するようには定義されていないので、errnoの値は必ずしも関係しません。

POSIXはerrnoを設定するのpthreads関数を強制しない(彼らはあるいはそれを設定しない場合があります - 何の要件はありません)。戻り値自体はエラー番号です。返される値は、その後0成功であり、それは何か他のものだ場合は、エラーを見つけるためにerrnoに割り当てる(または値を保持して、例えば、strerror()にそれを渡すために、他のint変数を使用する)ことができます。

+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を返し、失敗した場合は正の整数を返します。 –