名前


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 で定義されているすべてのエラー名には、 それぞれ異なる値が対応していなければならない。 但し、 EAGAINEWOULDBLOCK は例外で、これらは同じ値を持ってもよい。

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 == ...) { ... } }

このようにすると、参照している時点では errno はもはや somecall() から返された値を保持しているとは限らない (printf(3) により変更されているかもしれない)。 ライブラリコールをまたいで 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)

openSUSE Logo

コンテンツ