C言語:エラー番号
code:errno_hello.c
int main(int argc, char *argv[]) {
int r;
if (argc < 2) {
fprintf(stderr, "usage: %s number\n", argv0); exit(EXIT_FAILURE);
}
errno = 0;
if (r == 0) {
if (errno != 0) {
perror("atoi");
exit(EXIT_FAILURE);
}
}
printf("%d\n", r);
return EXIT_SUCCESS;
}
code:console
$ ./atoi_exp -1234567890876789098767890987678909876789098767890987678909876789098767890987678909876567890
atoi: Numerical result out of range
errno は int 型の数値
エラーが発生しないならば、errno は上書きされない。
呼び出された API 側が、正常の時に errno = 0 で上書きしてはならない。
errno を 0 にするのはアプリケーション側の責務。
通常は別のフラグでエラー発生を検出してから errno を見て判断する。
errno を見なければならないのは、詳細なエラー原因を知りたい場合。
別のフラグが正常値と見分けが付かないような場合に errno = 0 を事前に行う。
たとえば atoi はエラー時に0を返し正常値と区別が付かない。あらかじめ errno = 0 として、返り値が0だった場合に errno を確認する。
errno は、見掛け上グローバル変数のように見える。
マルチスレッドで使う場合は、ライブラリがスレッドセーフになっている必要がある。
C言語には例外機構がないため、どこかにジャンプせず、必ず次の行が実行されると考えてよい。
errno の名前に対して、番号は実行環境に依存している。コンパイルするときに静的に決定される。
errno の名前は場当たり的に増やされているため、本当に何が返ってくるのかは API の仕様を確認する必要がある。
POSIX で定義されている errno は以下にある。
名前のみで値は決まっていない。
関連
Linux の errno についてはここのリストに記載