名前
errno - 直近に発生したエラーの番号
書式
#include <errno.h>
説明
ヘッダファイル <errno.h> で整数型の変数 errno が定義されており、この変数には、 システムコール及びいくつかのライブラリ関数により エラーが発生した際にその原因を示す値が設定される。 この値はコールがエラー (通常 -1) を返した時にのみ意味を持つが、 ライブラリ関数は成功した場合も errno を変更することが許されている。
時には、関数が成功した場合の有効な返り値として -1 が返されることがある。 このような場合、エラーを検出するためには、呼び出しの前に errno を 0 にしておく必要がある。
errno は、ISO C standard で int 型の変更可能な左辺値 として定義されており、明示的に宣言を行ってはならない; errno はマクロの場合もありえる。 errno はスレッド毎に 値を持つ。つまりあるスレッドで errno が設定されても、 他のスレッドの errno には影響しない。
有効なエラー番号はいずれも 0 以外の値を持つ。 つまり、 errno を 0 に設定するライブラリ関数はない。 POSIX.1 で定義されているすべてのエラー名には、 それぞれ異なる値が対応していなければならない。 但し、 EAGAIN と EWOULDBLOCK は例外で、これらは同じ値を持ってもよい。
E2BIG | 引き数リストが長過ぎる (POSIX.1) |
EACCES | 許可がない (POSIX.1) |
EADDRINUSE | |
アドレスがすでに使用されている (POSIX.1) | |
EADDRNOTAVAIL | |
アドレスが使用できない (POSIX.1) | |
EAFNOSUPPORT | |
アドレス・ファミリーがサポートされていない (POSIX.1) | |
EAGAIN | リソースが一時的に利用不可 (EWOULDBLOCK と同じ値でもよい) (POSIX.1) |
EALREADY | |
接続が既に処理中である (POSIX.1) | |
EBADE | 不正なやり取り (exchange) である |
EBADF | ファイルディスクリプタが不正である (POSIX.1) |
EBADFD | ファイルディスクリプタが不正な状態である |
EBADMSG | |
メッセージが不正である (POSIX.1) | |
EBADR | 不正なリクエストディスクリプタ |
EBADRQC | |
不正なリクエストコード | |
EBADSLT | |
不正なスロット | |
EBUSY | リソースが使用中である (POSIX.1) |
ECANCELED | |
操作がキャンセルされた (POSIX.1) | |
ECHILD | 子プロセスが無い (POSIX.1) |
ECHRNG | チャンネル番号が範囲外である |
ECOMM | 送信時に通信エラーが発生した |
ECONNABORTED | |
接続が中止された (POSIX.1) | |
ECONNREFUSED | |
接続が拒否された (POSIX.1) | |
ECONNRESET | |
接続がリセットされた (POSIX.1) | |
EDEADLK | |
リソースのデッドロックを回避した (POSIX.1) | |
EDEADLOCK | |
EDEADLK の同義語 | |
EDESTADDRREQ | |
宛先アドレスが必要である (POSIX.1) | |
EDOM | 数学関数で引き数が領域外である (out of domain) |
EDQUOT | ディスク・クォータ (quota) を超過した (POSIX.1) |
EEXIST | ファイルが存在する (POSIX.1) |
EFAULT | アドレスが不正である (POSIX.1) |
EFBIG | ファイルが大き過ぎる (POSIX.1) |
EHOSTDOWN | |
ホストがダウンしている | |
EHOSTUNREACH | |
ホストに到達不能である (POSIX.1) | |
EIDRM | 識別子が削除された (POSIX.1) |
EILSEQ | 不正なバイト列 (POSIX.1, C99) |
EINPROGRESS | |
操作が実行中である (POSIX.1) | |
EINTR | 関数呼び出しが割り込まれた (POSIX.1) |
EINVAL | 引数が無効である (POSIX.1) |
EIO | 入出力エラー (POSIX.1) |
EISCONN | |
ソケットが接続されている (POSIX.1) | |
EISDIR | ディレクトリである (POSIX.1) |
EISNAM | 名前付きのファイルである |
EKEYEXPIRED | |
鍵が期限切れとなった | |
EKEYREJECTED | |
鍵がサーバにより拒否された | |
EKEYREVOKED | |
鍵が無効となった | |
EL2HLT | 停止 (レベル 2) |
EL2NSYNC | |
同期できていない (レベル 2) | |
EL3HLT | 停止 (レベル 3) |
EL3RST | リセット (レベル 3) |
ELIBACC | |
必要な共有ライブラリにアクセスできなかった | |
ELIBBAD | |
壊れた共有ライブラリにアクセスしようとした | |
ELIBMAX | |
リンクしようとした共有ライブラリが多過ぎる | |
ELIBSCN | |
a.out のライブラリセクションが壊れている (corrupted) | |
ELIBEXEC | |
共有ライブラリを直接実行できなかった | |
ELOOP | シンボリック・リンクの回数が多過ぎる (POSIX.1) |
EMEDIUMTYPE | |
間違ったメディア種別である | |
EMFILE | オープンされているファイルが多過ぎる (POSIX.1) |
EMLINK | リンクが多過ぎる (POSIX.1) |
EMSGSIZE | |
メッセージが長過ぎる (POSIX.1) | |
EMULTIHOP | |
マルチホップ (multihop) を試みた (POSIX.1) | |
ENAMETOOLONG | |
ファイル名が長過ぎる (POSIX.1) | |
ENETDOWN | |
ネットワークが不通である (POSIX.1) | |
ENETRESET | |
接続がネットワーク側から中止された (POSIX.1) | |
ENETUNREACH | |
ネットワークが到達不能である (POSIX.1) | |
ENFILE | システム全体でオープンされているファイルが多過ぎる (POSIX.1) |
ENOBUFS | |
使用可能なバッファ空間がない (POSIX.1 (XSI STREAMS option)) | |
ENODATA | |
ストリームの読み出しキューの先頭に読み出し可能なメッセージがない (POSIX.1) | |
ENODEV | そのようなデバイスは無い (POSIX.1) |
ENOENT | そのようなファイルやディレクトリは無い (POSIX.1) |
ENOEXEC | |
実行ファイル形式のエラー (POSIX.1) | |
ENOKEY | 要求された鍵が利用できない |
ENOLCK | 利用できるロックが無い (POSIX.1) |
ENOLINK | |
リンクが切れている (POSIX.1) | |
ENOMEDIUM | |
メディアが見つからない | |
ENOMEM | 十分な空きメモリ領域が無い (POSIX.1) |
ENOMSG | 要求された型のメッセージが存在しない (POSIX.1) |
ENONET | マシンがネットワーク上にない |
ENOPKG | パッケージがインストールされていない |
ENOPROTOOPT | |
指定されたプロトコルが利用できない (POSIX.1) | |
ENOSPC | デバイスに空き領域が無い (POSIX.1) |
ENOSR | 指定されたストリーム・リソースが存在しない (POSIX.1 (XSI STREAMS option)) |
ENOSTR | ストリームではない (POSIX.1 (XSI STREAMS option)) |
ENOSYS | 関数が実装されていない (POSIX.1) |
ENOTBLK | |
ブロックデバイスが必要である | |
ENOTCONN | |
ソケットが接続されていない (POSIX.1) | |
ENOTDIR | |
ディレクトリではない (POSIX.1) | |
ENOTEMPTY | |
ディレクトリが空ではない (POSIX.1) | |
ENOTSOCK | |
ソケットではない (POSIX.1) | |
ENOTSUP | |
操作がサポートされていない (POSIX.1) | |
ENOTTY | I/O 制御操作が適切でない (POSIX.1) |
ENOTUNIQ | |
名前がネットワークで一意ではない | |
ENXIO | そのようなデバイスやアドレスはない (POSIX.1) |
EOPNOTSUPP | |
ソケットでサポートしていない操作である (POSIX.1)
(Linux では ENOTSUP と EOPNOTSUPP は同じ値を持っているが、 POSIX.1 では両者のエラーの値は区別される必要がある。) | |
EOVERFLOW | |
指定されたデータ型に格納するには値が大き過ぎる (POSIX.1) | |
EPERM | 操作が許可されていない (POSIX.1) |
EPFNOSUPPORT | |
サポートされていないプロトコルファミリーである | |
EPIPE | パイプが壊れている (POSIX.1) |
EPROTO | プロトコル・エラー (POSIX.1) |
EPROTONOSUPPORT | |
プロトコルがサポートされていない (POSIX.1) | |
EPROTOTYPE | |
ソケットに指定できないプロトコル・タイプである (POSIX.1) | |
ERANGE | 結果が大き過ぎる (POSIX.1, C99) |
EREMCHG | |
リモートアドレスが変わった | |
EREMOTE | |
オブジェクトがリモートにある | |
EREMOTEIO | |
リモート I/O エラー | |
ERESTART | |
システムコールが中断され再スタートが必要である | |
EROFS | 読み出し専用のファイルシステムである (POSIX.1) |
ESHUTDOWN | |
通信相手がシャットダウンされて送信できない | |
ESPIPE | 無効なシーク (POSIX.1) |
ESOCKTNOSUPPORT | |
サポートされていないソケット種別である | |
ESRCH | そのようなプロセスは無い (POSIX.1) |
ESTALE | ファイルハンドルが古い状態になっている (POSIX.1)
NFS や他のファイルシステムで起こりうる。 |
ESTRPIPE | |
ストリーム・パイプ・エラー | |
ETIME | 時間が経過した
(POSIX.1 (XSI STREAMS option))
(POSIX.1 では "STREAM ioctl(2) timeout" と書かれている) |
ETIMEDOUT | |
操作がタイムアウトした (POSIX.1) | |
ETXTBSY | |
テキストファイルが使用中である (POSIX.1) | |
EUCLEAN | |
Structure needs cleaning | |
EUNATCH | |
プロトコルのドライバが付与 (attach) されていない | |
EUSERS | ユーザ数が多過ぎる |
EWOULDBLOCK | |
操作がブロックされる見込みである (EAGAIN と同じ値でもよい) (POSIX.1) | |
EXDEV | 不適切なリンク (POSIX.1) |
EXFULL | 変換テーブルが一杯である |
注意
以下はよくやる間違いである。
if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}
if (somecall() == -1) {
int errsv = errno;
printf("somecall() failed\n");
if (errsv == ...) { ... }
}
昔の C では、 <errno.h> をインクルードするのではなく errno を手動で (extern int errno のように) 定義するのが一般的であった。 このようなことはしないこと。 こうすると、最近のバージョンの C ライブラリでは正しく動作しないだろう。 しかし、(非常に) 古い Unix システムでは、 <errno.h> がなく、宣言が必要なことがあるかもしれない。 err(3), error(3), perror(3), strerror(3)