ERRNO
Section: Linux Programmer's Manual (3)
Updated: 2008-07-09
Index
JM Home Page
roff page
 
名前
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
は例外で、これらは同じ値を持ってもよい。
- 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)
 Index
- 名前
- 
- 書式
- 
- 説明
- 
- 注意
- 
This document was created by
man2html,
using the manual pages.
Time: 03:26:40 GMT, April 25, 2010