ERRNO(3) Library functions ERRNO(3) 名前 errno - 直近に発生したエラーの番号 書式 #include説明 ヘッダファイル で整数型の変数 errno が定義されており、この変数に は、システムコール及びいくつかのライブラリ関数によりエラーが発生した際にそ の 原因を示す値が設定される。この値はコールがエラー (通常 -1) を返した時に のみ意味を持つが、ライブラリ関数は成功した場合も errno を変更することが 許 されている。 時には、関数が成功した場合の有効な返り値として -1 が返されることがある。こ のような場合、エラーを検出するためには、呼び出しの前に errno を 0 にしてお く必要がある。 errno は、ISO C standard で int 型の変更可能な左辺値として定義されており、 明示的に宣言を行ってはならない; errno はマクロの場合もありえる。 errno は ス レッド毎に値を持つ。つまりあるスレッドで errno が設定されても、他のスレ ッドの errno には影響しない。 有効なエラー番号はいずれも 0 以外の値を持つ。つまり、 errno を 0 に設定 す る ライブラリ関数はない。 POSIX.1 で定義されているすべてのエラー名には、そ れぞれ異なる値が対応していなければならない。但し、 EAGAIN と EWOULDBLOCK は例外で、これらは同じ値を持ってもよい。 POSIX.1 (2001 年版) でのエラー名シンボルのリストを以下に示す。これらのうち 、 EDOM と ERANGE は ISO C standard にある。さらに、ISO C Amendment 1 では 、エラー番号 EILSEQ がマルチバイト文字やワイド文字での符号化エラーを表すた めに定義されている。 E2BIG 引数リストが長すぎる EACCES 権限がない EADDRINUSE アドレスが使用されている EADDRNOTAVAIL アドレスが使用できない EAFNOSUPPORT アドレス・ファミリーがサポートされていない EAGAIN リソースが一時的に利用不可 EALREADY 接続が既に処理中である EBADF ファイルディスクリプタが不正である EBADMSG メッセージが不正である EBUSY リソースが使用中である ECANCELED 操作がキャンセルされた ECHILD 子プロセスが無い ECONNABORTED 接続が中止された ECONNREFUSED 接続が拒否された ECONNRESET 接続がリセットされた EDEADLK リソースのデッドロックを回避した EDESTADDRREQ 宛先アドレスが必要である EDOM ドメインエラー EDQUOT 予約語 EEXIST ファイルが存在する EFAULT アドレスが不正である EFBIG ファイルが大きすぎる EHOSTUNREACH ホストに到達不能である EIDRM 識別子が削除された EILSEQ 不正なバイト列 EINPROGRESS 操作が実行中である EINTR 関数呼び出しが割り込まれた EINVAL 引数が無効である EIO 入出力エラー EISCONN ソケットが接続されている EISDIR ディレクトリである ELOOP シンボリック・リンクの回数が多すぎる EMFILE オープンされているファイルが多すぎる EMLINK リンクが多すぎる EMSGSIZE メッセージバッファの長さが適切でない EMULTIHOP 予約語 ENAMETOOLONG ファイル名が長すぎる ENETDOWN ネットワークが不通である ENETRESET 接続がネットワーク側から中止された ENETUNREACH ネットワークが到達不能である ENFILE システム全体でオープンされているファイルが多すぎる ENOBUFS 使用可能なバッファ空間がない ENODATA ストリームの読み出しキューの先頭に読み出し可能なメッセージがない ENODEV そのようなデバイスは無い ENOENT そのようなファイルやディレクトリは無い ENOEXEC 実行ファイル形式のエラー ENOLCK 利用できるロックが無い ENOLINK 予約語 ENOMEM 十分な空きメモリ領域が無い ENOMSG 要求された型のメッセージが存在しない ENOPROTOOPT 指定されたプロトコルが利用できない ENOSPC デバイスに空き領域が無い ENOSR 指定されたストリーム・リソースが存在しない ENOSTR ストリームではない ENOSYS 関数が実装されていない ENOTCONN ソケットが接続されていない ENOTDIR ディレクトリではない ENOTEMPTY ディレクトリが空ではない ENOTSOCK ソケットではない ENOTSUP サポートされていない ENOTTY I/O 制御操作が適切でない ENXIO そのようなデバイスやアドレスはない EOPNOTSUPP ソケットがサポートしていない操作である EOVERFLOW 指定されたデータ型に格納するには値が大きすぎる EPERM 操作が許可されていない EPIPE パイプが破壊された EPROTO プロトコル・エラー EPROTONOSUPPORT プロトコルがサポートされていない EPROTOTYPE ソケットに指定できないプロトコル・タイプである ERANGE 結果が大きすぎる EROFS ファイルシステムがリードオンリー ESPIPE 無効なシーク ESRCH そのようなプロセスは無い ESTALE ファイルハンドルが古い状態になっている ETIME ストリームに対する ioctl() がタイムアウトした ETIMEDOUT 操作がタイムアウトした ETXTBSY テキストファイルが使用中である EWOULDBLOCK 操作がブロックされる見込みである (EAGAIN と同じ値でもよい) EXDEV 不適切なリンク 注意 以下はよくやる間違いである。 if (somecall() == -1) { printf("somecall() failed\n"); if (errno == ...) { ... } } このようにすると、参照している時点では errno はもはや somecall() から返 さ れ た値を保持しているとは限らない (printf() により変更されているかもしれな い)。ライブラリコールをまたいで errno の値を保存したい場合は、以下のように 保存しなければならない: if (somecall() == -1) { int errsv = errno; printf("somecall() failed\n"); if (errsv == ...) { ... } } 昔 の C で は 、 をインクルードするのではなく errno を手動で (extern int errno のように) 定義するのが一般的であった。 このようなこと は し ないこと。こうすると、最近のバージョンの C ライブラリでは正しく動作しな いだろう。しかし、(非常に) 古い Unix システムでは、 がなく、宣言 が必要なことがあるかもしれない。 関連項目 err(3), perror(3), strerror(3)

