47

sendとに似たインターフェースをエクスポートするモジュールを書いていますrecv

これらの関数は送信バイト数と受信バイト数をそれぞれ返すことになっているため、通常のように適切なエラー管理を行うことができません (つまり、列挙型を使用してニーモニック値を返します)。

このような状況ではerrno、標準ライブラリのように設定する必要がありますか? もしそうなら、それerrnoはスレッド固有なので、特定の書き方がありますか、それとも単純に値を割り当てることができますか?

編集:errno実験して、割り当てによる設定が機能していることに気付きました。それでも:これはどのシステムでも安全で移植可能ですか?

4

6 に答える 6

39

これは少し古いですが、errno-手動セクション3には、マクロであり、スレッドローカルであるにもかかわらず、直接割り当てることができると書かれています。

于 2012-03-25T00:20:46.507 に答える
23

設定できるだけでなくerrno、多くの場合、設定する必要がerrnoあります。一部のライブラリ関数を呼び出す場合、最初errnoにゼロに設定した場合にのみ確実にエラーを検出できます。例については、を参照strtolしてください。

のPOSIX仕様からstrtol

[CX] [Option Start] strtol() 関数は、成功した場合、errno の設定を変更しません。

0、{LONG_MIN} または {LLONG_MIN}、および {LONG_MAX} または {LLONG_MAX} はエラー時に返され、成功した場合にも有効な戻り値であるため、エラー状況をチェックしたいアプリケーションは errno を 0 に設定してから、strtol() を呼び出す必要があります。または strtoll() を呼び出してから、errno を確認してください。【オプション終了】

于 2012-07-05T11:01:46.027 に答える
10

実際には、を返すので、おそらく「適切な」(あなたが言うように)エラー管理を行うことができintます。

読み取りまたは書き込みのバイト数には負でない値を使用し、エラーコードには負の値を使用してください。自分を制限する必要はありませ-1

enum myerrors {
    ERR_NO_MEMORY    = -1,
    ERR_BAD_ARGS     = -2,
    ERR_CPU_EXPLODED = -3,
    // and so on
};

ただし、errno希望する方法で設定することは有効です。標準ではerrno、変更可能な左辺値に展開されると規定されています。つまり、設定することができます。差出人C1x/n1425, 7.5 Errors <errno.h>

...errnoこれは、int型の変更可能な左辺値に展開され、その値は、いくつかのライブラリ関数によって正のエラー数に設定されます。

于 2012-03-25T00:20:42.180 に答える
6

に値を割り当てることもできますがerrno、状況によっては、エラーを通知する他の方法がより適切である可能性があることに注意してください。

  1. 読み取られたバイト数を返さないでください。代わりに、タイプ(または使用するもの)の出力パラメーターを指定してください。その後、エラーコードを返すことができます。int *size_t *
  2. 戻りタイプが符号付きタイプであり、負の送信または受信バイト数が意味をなさないと仮定して、負の値を使用してそれぞれのエラー状態を通知します。
于 2012-03-25T00:22:20.000 に答える
3

はい、割り当てることができます。はい、割り当てはスレッドセーフになります。errnoはスレッドセーフですか?を参照してください。

于 2012-03-25T00:22:37.300 に答える
2

差出人:http ://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm

の唯一の移植可能な値errnoEDOMERANGE

これで、移植性に関する質問に答えます。

于 2012-03-25T00:20:48.280 に答える