errno(3) 直近に発生したエラーの番号

書式

#include <errno.h>

説明

ヘッダファイル <errno.h> で整数型の変数 errno が定義されており、 システムコールやいくつかのライブラリ関数は、エラーが発生した際に この変数にその原因を示す値を設定する。 この値は呼び出しの返り値がエラー (ほとんどのシステムコールでは -1 で、ほとんどのライブラリ関数では -1 か NULL) を示したときに のみ意味を持つが、ライブラリ関数は成功した場合も errno を変更することが許されている。

有効なエラー番号はいずれも 0 以外の値を持つ。 どのシステムコールもライブラリ関数も errno を 0 に設定することはない。

いくつかのシステムコールやライブラリ関数 (例えば getpriority(2)) では、成功した場合の有効な返り値として -1 が返されることがある。 このような場合、成功なのかエラーなのかを区別するためには、 呼び出しの前に errno を 0 に設定しておけばよい。呼び出しの返り値がエラー発生の可能性を 示すものだった場合には、 errno が 0 以外の値かを見て確認すればよい。

errno は、ISO C standard で int 型の変更可能な左辺値 として定義されており、明示的に宣言を行ってはならない; errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。 つまりあるスレッドで errno が設定されても、 他のスレッドの errno には影響しない。

POSIX.1 で定義されているすべてのエラー名には、 それぞれ異なる値が対応していなければならない。 但し、 EAGAINEWOULDBLOCK は例外で、これらは同じ値を持ってもよい。

Below is a list of the symbolic error names that are defined on Linux. Some of these are marked POSIX.1, indicating that the name is defined by POSIX.1-2001, or C99, indicating that the name is defined by C99.

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); signal(7) 参照。
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 では ENOTSUPEOPNOTSUPP は同じ値を持つが、 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> がなく、宣言が必要なことがあるかもしれない。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。