[linux] ERRNO

|
ERRNO(3)        Library functions       ERRNO(3)

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

書式
  #include 

説明
  ヘッダファイル  で整数型の変数 errno が定義されており、この変数に
  は、システムコール及びいくつかのライブラリ関数によりエラーが発生した際にそ
  の 原因を示す値が設定される。この値はコールがエラー (通常 -1) を返した時に
  のみ意味を持つが、ライブラリ関数は成功した場合も errno を変更することが 許
  されている。

  時には、関数が成功した場合の有効な返り値として -1 が返されることがある。こ
  のような場合、エラーを検出するためには、呼び出しの前に errno を 0 にしてお
  く必要がある。

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

  有効なエラー番号はいずれも 0 以外の値を持つ。つまり、 errno を 0 に設定 す
  る ライブラリ関数はない。 POSIX.1 で定義されているすべてのエラー名には、そ
  れぞれ異なる値が対応していなければならない。但し、 EAGAIN  と  EWOULDBLOCK
  は例外で、これらは同じ値を持ってもよい。

  POSIX.1 (2001 年版) でのエラー名シンボルのリストを以下に示す。これらのうち
  、 EDOM と ERANGE は ISO C standard にある。さらに、ISO C Amendment 1 では
  、エラー番号 EILSEQ がマルチバイト文字やワイド文字での符号化エラーを表すた
  めに定義されている。

  E2BIG  引数リストが長すぎる

  EACCES 権限がない

  EADDRINUSE
    アドレスが使用されている

  EADDRNOTAVAIL
    アドレスが使用できない

  EAFNOSUPPORT
    アドレス・ファミリーがサポートされていない

  EAGAIN リソースが一時的に利用不可

  EALREADY
    接続が既に処理中である

  EBADF  ファイルディスクリプタが不正である

  EBADMSG
    メッセージが不正である

  EBUSY  リソースが使用中である

  ECANCELED
    操作がキャンセルされた

  ECHILD 子プロセスが無い

  ECONNABORTED
    接続が中止された

  ECONNREFUSED
    接続が拒否された

  ECONNRESET
    接続がリセットされた

  EDEADLK
    リソースのデッドロックを回避した

  EDESTADDRREQ
    宛先アドレスが必要である

  EDOM   ドメインエラー

  EDQUOT 予約語

  EEXIST ファイルが存在する

  EFAULT アドレスが不正である

  EFBIG  ファイルが大きすぎる

  EHOSTUNREACH
    ホストに到達不能である

  EIDRM  識別子が削除された

  EILSEQ 不正なバイト列

  EINPROGRESS
    操作が実行中である

  EINTR  関数呼び出しが割り込まれた

  EINVAL 引数が無効である

  EIO    入出力エラー

  EISCONN
    ソケットが接続されている

  EISDIR ディレクトリである

  ELOOP  シンボリック・リンクの回数が多すぎる

  EMFILE オープンされているファイルが多すぎる

  EMLINK リンクが多すぎる

  EMSGSIZE
    メッセージバッファの長さが適切でない

  EMULTIHOP
    予約語

  ENAMETOOLONG
    ファイル名が長すぎる

  ENETDOWN
    ネットワークが不通である

  ENETRESET
    接続がネットワーク側から中止された

  ENETUNREACH
    ネットワークが到達不能である

  ENFILE システム全体でオープンされているファイルが多すぎる

  ENOBUFS
    使用可能なバッファ空間がない

  ENODATA
    ストリームの読み出しキューの先頭に読み出し可能なメッセージがない

  ENODEV そのようなデバイスは無い

  ENOENT そのようなファイルやディレクトリは無い

  ENOEXEC
    実行ファイル形式のエラー

  ENOLCK 利用できるロックが無い

  ENOLINK
    予約語

  ENOMEM 十分な空きメモリ領域が無い

  ENOMSG 要求された型のメッセージが存在しない

  ENOPROTOOPT
    指定されたプロトコルが利用できない

  ENOSPC デバイスに空き領域が無い

  ENOSR  指定されたストリーム・リソースが存在しない

  ENOSTR ストリームではない

  ENOSYS 関数が実装されていない

  ENOTCONN
    ソケットが接続されていない

  ENOTDIR
    ディレクトリではない

  ENOTEMPTY
    ディレクトリが空ではない

  ENOTSOCK
    ソケットではない

  ENOTSUP
    サポートされていない

  ENOTTY I/O 制御操作が適切でない

  ENXIO  そのようなデバイスやアドレスはない

  EOPNOTSUPP
    ソケットがサポートしていない操作である

  EOVERFLOW
    指定されたデータ型に格納するには値が大きすぎる

  EPERM  操作が許可されていない

  EPIPE  パイプが破壊された

  EPROTO プロトコル・エラー

  EPROTONOSUPPORT
    プロトコルがサポートされていない

  EPROTOTYPE
    ソケットに指定できないプロトコル・タイプである

  ERANGE 結果が大きすぎる

  EROFS  ファイルシステムがリードオンリー

  ESPIPE 無効なシーク

  ESRCH  そのようなプロセスは無い

  ESTALE ファイルハンドルが古い状態になっている

  ETIME  ストリームに対する ioctl() がタイムアウトした

  ETIMEDOUT
    操作がタイムアウトした

  ETXTBSY
    テキストファイルが使用中である

  EWOULDBLOCK
    操作がブロックされる見込みである (EAGAIN と同じ値でもよい)

  EXDEV  不適切なリンク

注意
  以下はよくやる間違いである。

    if (somecall() == -1) {
        printf("somecall() failed\n");
        if (errno == ...) { ... }
    }

  このようにすると、参照している時点では errno はもはや somecall() から返 さ
  れ た値を保持しているとは限らない (printf() により変更されているかもしれな
  い)。ライブラリコールをまたいで errno の値を保存したい場合は、以下のように
  保存しなければならない:

    if (somecall() == -1) {
        int errsv = errno;
        printf("somecall() failed\n");
        if (errsv == ...) { ... }
    }

  昔 の  C   で は 、   をインクルードするのではなく errno を手動で
  (extern int errno のように) 定義するのが一般的であった。 このようなこと は
  し ないこと。こうすると、最近のバージョンの C ライブラリでは正しく動作しな
  いだろう。しかし、(非常に) 古い Unix システムでは、  がなく、宣言
  が必要なことがあるかもしれない。

関連項目
  err(3), perror(3), strerror(3)