ERRNO(3)

名前
errno - 直近に発生したエラーの番号

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

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