Linux Kernel: エラー番号の一覧

前書き

本記事では、Linux Kernelが用いるエラー番号を説明します。

              

Linux Kernelがエラー番号(errno)を正しく返す意義

Linux Kernelでは、エラーの種類に応じて、返すべきエラー番号が定められています。例えば、ファイルが存在しない場合は、”ENOENT(No such file or directory、 エラー番号2)”を返します。Linux Kernel内のエラー内容は、変数errnoを通してUser空間にも伝わります。

Linux Kernel内で誤ったエラー番号を使用した場合、その影響は広範囲に渡ります。Kernel空間は勿論ですが、User空間アプリケーションに本来であれば不要であった判断や対応を強いる事になります。さらに、エラー番号の誤りに気づき、Kernelコードを修正した後もまた、Kernel空間/User空間の両方に影響が出ます。

すなわち、他の人に迷惑をかけないために、Linux Kernelコード内で定義されたエラー番号を正しく使う事が重要になります。ちなみに、Linux Kernelのエラー番号は、以下の特徴があります。

特徴
  • FreeBSD Kernelよりもエラー番号が多い事
  • Linux Kernel内専用のエラー番号がある事

                     

エラー番号の定義ファイル

エラー番号の定義ファイルは、下表の3種類存在します。それぞれのファイルに定義されたエラー番号の意味も後述します(表の中だけ、である調にします)。

PATH内容
<KERNEL_TOP>/include/uapi/asm-generic/errno-base.hファイル・リソースの基本的なエラー状態を説明するためのエラー番号(1〜34)
<KERNEL_TOP>/include/uapi/asm-generic/errno.herrno-base.hで表しきれなかったエラー状態を説明するためのエラー番号(35〜133)
<KERNEL_TOP>/include/linux/errno.hKernel空間のみで使用するエラー番号(512〜518、521〜530)

     

<KERNEL_TOP>/include/uapi/asm-generic/errno-base.h
名称原文和訳
EPERM1Operation not permitted許可されていない操作である
ENOENT2No such file or directoryファイルまたはディレクトリが存在しない
ESRCH3No such process指定されたプロセスが存在しない
EINTR4Interrupted system callシグナル割り込みが発生した
EIO5I/O error入出力エラーである
ENXIO6No such device or addressデバイスまたはアドレスが存在しない
E2BIG7Argument list too long引数リストが長すぎる
ENOEXEC8Exec format error実行形式が異常である
EBADF9Bad file number無効(異常)なファイル番号
ECHILD10No child processes子プロセスが存在しない
EAGAIN11Try again

再実行する事(EWOULDBLOCKも同じ番号)

ENOMEM12Out of memoryメモリー不足である
EACCES13Permission denied権限が無い
EFAULT14Bad address無効なアドレス
ENOTBLK15Block device requiredブロックデバイスが必要である
EBUSY16Device or resource busyデバイスまたはリソースは使用中である
EEXIST17File existsファイルは既に存在する
EXDEV18Cross-device linkデバイスをまたぐリンクである
ENODEV19No such deviceデバイスが存在しない
ENOTDIR20Not a directoryディレクトリではない
EISDIR21Is a directoryディレクトリである
EINVAL22Invalid argument無効な引数である
ENFILE23File table overflowオープン済ファイル(ファイルディスクリプタ)がシステム上限に達している
EMFILE24Too many open files開いているファイルが多すぎる
ENOTTY25Not a typewriterTTYではない
ETXTBSY26Text file busyテキストファイルが使用中である
EFBIG27File too largeファイルが大きすぎる
ENOSPC28No space left on deviceデバイスの空き領域が不足している
ESPIPE29Illegal seek無効なシークである
EROFS30Read-only file systemリードオンリーファイルシステムである
EMLINK31Too many linksリンクの数が多すぎる
EPIPE32Broken pipeパイプが壊れている(既にクライアントでcloseされている状態など)
EDOM33Math argument out of domain of func数値引数が領域外である
ERANGE34Math result not representable結果が大き過ぎる

                                   

<KERNEL_TOP>/include/uapi/asm-generic/errno.h
名称原文和訳(補足説明)
EDEADLK35Resource deadlock would occur

リソースデッドロックが発生する見込みである。(EDEADLOCKでも定義されている)Kernel内部のデッドロック検知システムlockdepなどで、デッドロック検知時に使われる。

ENAMETOOLONG36File name too longファイル名が長過ぎる
ENOLCK37No record locks available利用できるレコードロックが無い
ENOSYS38Function not implemented関数(system call)は実装されていない。本当に関数が存在しないかどうかを判断するために、system callの実装内で、このエラー番号は使うべきでない。
ENOTEMPTY39Directory not emptyディレクトリーが空ではない
ELOOP40Too many symbolic links encounteredシンボリックリンクの回数が多すぎる
ENOMSG42No message of desired type要求された型のメッセージが無い
EIDRM43Identifier removed識別子は削除された
ECHRNG44Channel number out of rangeチャンネル番号が範囲外である
EL2NSYNC45Level 2 not synchronized同期できていない (レベル2)
EL3HLT46Level 3 halted停止 (レベル3)
EL3RST47Level 3 resetリセット (レベル3)
ELNRNG48Link number out of rangeリンク番号が範囲外である
EUNATCH49Protocol driver not attachedプロトコルドライバがアタッチされていない
ENOCSI50No CSI structure availableCSI構造が利用できない
EL2HLT51Level 2 halted停止 (レベル2)
EBADE52Invalid exchange不正な交換である
EBADR53Invalid request descriptor無効な要求ディスクリプターである
EXFULL54Exchange full変換テーブルが一杯である
ENOANO55No anodeinodeが無い(諸説があるエラー番号
EBADRQC56Invalid request code不正なリクエストコードである
EBADSLT57Invalid slot不正なスロットである
EBFONT59Bad font file format不正なフォントファイルフォーマットである
ENOSTR60Device not a streamストリームではない
ENODATA61No data availableデータが無い
ETIME62Timer expired時間が経過した(時間による失効)
ENOSR63Out of streams resourcesストリームリソースが存在しない
ENONET64Machine is not on the network装置がネットワーク上に無い
ENOPKG65Package not installedパッケージがインストールされていない
EREMOTE66Object is remoteオブジェクトがリモートにある
ENOLINK67Link has been severedリンクが切れている
EADV68Advertise errorAdvertiseエラー
ESRMNT69Srmount errorSrmountエラー
ECOMM70Communication error on send送信時に通信エラーが発生した
EPROTO71Protocol errorプロトコルエラーである
EMULTIHOP72Multihop attemptedマルチホップが試みられた
EDOTDOT73RFS specific errorRFS特有のエラーである
EBADMSG74Not a data messageデータメッセージではない
EOVERFLOW75Value too large for defined data typeデータ型に格納するには値が大きすぎる
ENOTUNIQ76Name not unique on network名前がネットワークで一意ではない
EBADFD77File descriptor in bad stateファイルディスクリプターが不正な状態である
EREMCHG78Remote address changedリモートアドレスが変わった
ELIBACC79Can not access a needed shared library必要な共有ライブラリにアクセスできない
ELIBBAD80Accessing a corrupted shared library壊れた共有ライブラリにアクセスをした
ELIBSCN81.lib section in a.out corrupted.libセクションが壊れている
ELIBMAX82Attempting to link in too many shared librariesリンクしようとした共有ライブラリが多過ぎる
ELIBEXEC83Cannot exec a shared library directly共有ライブラリを直接実行できなかった
EILSEQ84Illegal byte sequence不正なバイト列である
ERESTART85Interrupted system call should be restarted中断システムコールは再起動が必要である
ESTRPIPE86Streams pipe errorストリームパイプエラー
EUSERS87Too many usersユーザー数が多過ぎる
ENOTSOCK88Socket operation on non-socketソケットではない
EDESTADDRREQ89Destination address required宛先のアドレスが必要
EMSGSIZE90Message too longメッセージが長過ぎる
EPROTOTYPE91Protocol wrong type for socketソケットに指定できないプロトコルタイプである
ENOPROTOOPT92Protocol not available利用できないプロトコルである
EPROTONOSUPPORT93Protocol not supported未対応のプロトコルである
ESOCKTNOSUPPORT94Socket type not supported未対応のソケットタイプである
EOPNOTSUPP95Operation not supported on transport endpointトランスポートエンドポイントで未対応の操作
EPFNOSUPPORT96Protocol family not supported対応していないプロトコルファミリーである
EAFNOSUPPORT97Address family not supported by protocol対応していないアドレスファミリーである
EADDRINUSE98Address already in useアドレスは既に使用されている
EADDRNOTAVAIL99Cannot assign requested addressアドレスが使用できない
ENETDOWN100Network is downネットワークは不通である
ENETUNREACH101Network is unreachableネットワークは到達不能である
ENETRESET102Network dropped connection because of resetリセットでネットワーク接続が失われた
ECONNABORTED103Software caused connection abortソフトウェア要求により接続は中止された
ECONNRESET104Connection reset by peer接続は相手からリセットされた
ENOBUFS105No buffer space availableバッファーは容量不足である
EISCONN106Transport endpoint is already connectedトランスポートエンドポイントは既に接続されている
ENOTCONN107Transport endpoint is not connectedトランスポートエンドポイントは接続されていない
ESHUTDOWN108Cannot send after transport endpoint shutdownトランスポートエンドポイントはシャットダウン中であり送信できない
ETOOMANYREFS109Too many references: cannot splice処理限界を超える多重参照である
ETIMEDOUT110Connection timed out操作はタイムアウトした
ECONNREFUSED111Connection refused接続は拒否された
EHOSTDOWN112Host is downホストはダウンしている
EHOSTUNREACH113No route to hostホストに到達不能である
EALREADY114Operation already in progress操作は既に実行中である
EINPROGRESS115Operation now in progress操作は現在実行中である
ESTALE116Stale NFS file handleNFSファイルハンドルが古い
EUCLEAN117Structure needs cleaning構造のクリーニングが必要である
ENOTNAM118Not a XENIX named type fileXENIX名前付きファイルではない
ENAVAIL119No XENIX semaphores availableXENIXセマフォは利用できない
EISNAM120Is a named type file名前付きファイルである
EREMOTEIO121Remote I/O errorリモートI/Oエラーである
EDQUOT122Quota exceededクォータ超過である
ENOMEDIUM123No medium foundメディアが見つからない
EMEDIUMTYPE124Wrong medium type間違ったメディアタイプである
ECANCELED125Operation Canceled処理はキャンセルされた
ENOKEY126Required key not available要求された鍵が利用できない
EKEYEXPIRED127Key has expired鍵の期限が切れた
EKEYREVOKED128Key has been revoked鍵が無効となった
EKEYREJECTED129Key was rejected by service鍵がサーバーにより拒否された
EOWNERDEAD130Owner died所有者が死亡した
ENOTRECOVERABLE131State not recoverable状態は回復不能である
ERFKILL132Operation not possible due to RF-killRF-killのため操作できない
EHWPOISON133Memory page has hardware errorメモリページはHWエラーがあります。

 

<KERNEL_TOP>/include/linux/errno.h
名称原文和訳(補足説明)
ERESTARTSYS512

(無し)

system callが再起動可能である事を示す
ERESTARTNOINTR513(無し)systemcallを必ず再実行する
ERESTARTNOHAND514 restart if no handler.ハンドラが無ければ再実行する 
ENOIOCTLCMD515 No ioctl commandioctl() が存在しない
ERESTART_RESTARTBLOCK516restart by calling sys_restart_syscallsys_restart_syscall()によって、再実行する
EPROBE_DEFER517Driver requests probe retryドライバはprobe(探査、初期化)の再実行を要求している
EOPENSTALE518 open found a stale dentry

古いdentryを発見した(Openした)

EBADHANDLE521  Illegal NFS file handle 不正なNFSファイルハンドラである
ENOTSYNC522 Update synchronization mismatch 更新同期の不一致である
EBADCOOKIE523 Cookie is staleCookieが古い 
ENOTSUPP524Operation is not supportedその操作はサポートしていない 
ETOOSMALL 525 Buffer or request is too smallバッファかリクエストが小さすぎる 
ESERVERFAULT526An untranslatable error occurred 翻訳(変換)できないエラーが発生した 
EBADTYPE 527 Type not supported by serverサーバによって、その型がサポートされていない 
EJUKEBOX528 Request initiated, but will not complete before timeoutリクエストは開始されたが、タイムアウトまでに完了しなかった
EIOCBQUEUED529iocb queued, will get completion event iocbがキューに入れられ、完了イベントが取得される
ERECALLCONFLICT530 conflict with recalled state 再呼び出し状態での衝突である

                                   

補足:User空間でKernel空間のエラー番号を見る方法

User空間には、Kernel空間のエラー番号を示すerrnoが存在します。以下にerrnoに関するMANページ情報を引用します。

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

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

この変数errnoの取り扱いで、注意すべきポイントが2つあります。

ポイント
  • 関数コール前にerrnoを初期化(エラー番号をセット後、その番号を保持し続けるため)
  • 関数コール後にerrno値を別変数にコピー(errnoは一つしかなく、書き換わる可能性があるため)

以下に、存在しないファイルをOpenしようとし、エラーが発生するサンプルプログラム(および実行結果)を示します。プログラム中で使用している関数perror()は、変数errnoに格納されたエラー番号とメッセージを対応付け、メッセージを標準エラー出力に書き出します。

                               

あわせて読みたい

1件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です