INTRO(2)

名称
intro - システムコールとエラー番号の紹介

ライブラリ
libc

書式
<errno.h>

解説
このセクションでは、システムコール、エラー戻り、 その他の共通な定義およびコンセプトの概要について説明します。

戻り値
ほとんどすべてのシステムコールが外部識別子 errno によって参照される エラー番号を備えています。 <sys/errno.h> 内でこの識別子は次のように定義されています。

    extern int * __error();
    #define errno (* __error())

__error() 関数は、初期スレッド以外のスレッドについては、スレッドに固有な構造体の フィールドを指すポインタを返します。 初期スレッドと非スレッドプロセスの場合、 __error() は、以前の定義と互換性のあるグローバル変数 errno を指すポインタを返します。

システムコールは、エラーを検出すると、障害を示す整数値 (通常は -1) を返し、 それに応じて変数 errno を設定します。 <これにより、-1 を受け取ったときに障害を解釈し、 それに応じた行動をとることを可能にします。> 呼び出しが正常に完了した場合は errno が設定されることはありません。 いったん設定されると、別のエラーが起きるまでそのままです。 これはエラーの後でだけ調べるべきです。 多くのシステムコールがこれらのエラー番号の意味を過重にしており、 意味は呼び出しのタイプと状況に従って解釈する必要があることに注意してください。

以降に示すのはエラーの完全なリストであり、これらの名前は <sys/errno.h> に記載されています。

0 Undefined error: 0.
    「未定義のエラー: 0」 未使用。

1 EPERM Operation not permitted.
    「操作が許されません」 適切な特権をもつプロセスに限定された操作、 またはファイルその他のリソースの所有者に 限定された操作を実行しようとしました。

2 ENOENT No such file or directory.
    「そのようなファイルまたはディレクトリはありません」 指定のパス名の構成要素が存在しないか、またはパス名が空の文字列でした。

3 ESRCH No such process.
    「そのようなプロセスはありません」 指定のプロセス ID に対応するプロセスが見つかりませんでした。

4 EINTR Interrupted system call.
    「関数呼び出しが割り込まれました」 割り込み可能な関数の実行中に、非同期シグナル (たとえば、 SIGINT または SIGQUIT) がプロセスによって捕らえられました。 シグナルハンドラが正常に戻ると、 割り込みされたシステムコールがエラー状態を返したように見えます。

5 EIO Input/output error.
    「入出力エラーです」 何らかの物理的な入力エラーまたは出力エラーが起きました。 このエラーは、同じファイル記述子に対する操作が次に行われるまで報告されず、 後続のエラーによって失われる (上書きされる) 可能性があります。

6 ENXIO Device not configured.
    「デバイスが準備されていません」 存在しないデバイスを参照している特殊ファイルへの入出力が行われたか、 またはデバイスの制限を越えた要求が行われました。 このエラーは、テープドライブがオンラインでない場合や、 またはディスクパックがドライブにロードされていない場合などにも 発生する可能性があります。

7 E2BIG Argument list too long.
    「引数のリストが長すぎます」 新しいプロセスの引数リストと環境変数リストに使用されるバイト数が、 現在の限界である 65536 バイト <(> sys/param.h 内の NCARGS) を越えました。

8 ENOEXEC Exec format error.
    「実行形式エラーです」 実行を要求されたファイルのパーミッションは適切でしたが、 実行可能ファイルとして要求される形式ではありませんでした。

9 EBADF Bad file descripter.
    「ファイル記述子が不良です」 ファイル記述子引数が範囲外であったか、 開いていないファイルを参照していたか、 または書込み (読取り) 専用に開かれたファイルに 読取り (書込み) 要求が行われました。

10 ECHILD No child processes.
    「子プロセスがありません」 wait(2) または waitpid(2) 関数が、子プロセスが存在しないか、待機されたことのない 子プロセスを持たないプロセスによって実行されました。

11 EDEADLK Resource deadlock avoided.
    「リソースデッドロックを回避しました」 デッドロック状況になる可能性のあるシステムリソースをロックしようとしました。

12 ENOMEM Cannot allocate memory.
    「メモリの割り当てができません」 新しいプロセスイメージが、ハードウェアまたはシステムが課する メモリ管理制約によって許容されるより多くのメモリを要求しました。 スワップ空間の不足は通常、一時的です。 しかし、コアの不足は一時的ではありません。 ソフト限界を対応するハード限界まで増加させることはできます。

13 EACCES Permission denied.
    「パーミッションが拒絶されました」 ファイルアクセスパーミッションで禁止されている方法で ファイルにアクセスしようとしました。

14 EFAULT Bad address.
    「不正なアドレスです」 呼び出しで渡された引数を使おうとしているときに、 システムが無効なアドレスを検出しました。

15 ENOTBLK Block device required.
    「ブロックデバイスが要求されています」 ブロックデバイス操作が、非ブロックデバイスまたはファイルについて 試みられました。

16 EBUSY Device busy.
    「デバイスがビジー状態です」 その時点で使用されているシステムリソースを、 その要求と干渉するであろう方法で使おうとしました。

17 EEXIST File exists.
    「ファイルが存在します」 すでに存在するファイルが不適切なコンテキストで指定されました。 たとえば、 link(2) システムコールにおける新しいリンク名としてです。

18 EXDEV Cross-device link.
    「デバイスをまたぐリンクです」 別のファイルシステム上のファイルへのハードリンクが 試みられました。

19 ENODEV Operation not supported.
    「操作がデバイスによってサポートされていません」 あるデバイスに不適切な関数を適用しようしました。 たとえば、プリンタのような書込み専用デバイスを読み取ろうとしました。

20 ENOTDIR Not a directory.
    「ディレクトリではありません」 指定のパス名の構成要素は確かに存在しましたが、 ディレクトリが求められているにもかかわらず、 それがディレクトリではありませんでした。

21 EISDIR Is a directory.
    「ディレクトリです」 書込みモードを指定してディレクトリをオープンしようとしました。

22 EINVAL Invalid argument.
    「無効な引数です」 無効な引数が指定されました (たとえば、 signal(3) システムコールまたは kill(2) システムコールに未定義のシグナルを指定する場合)。

23 ENFILE Too many open files in system.
    「システム内でオープンされているファイルが多すぎます」 システムが許容するファイル記述子の数の最大数に到達しており、少なくとも 1 つがクローズされるまで、オープンしようとする要求は満たされません。

24 EMFILE Too many open files.
    「オープンしているファイルが多すぎます」 <現在のリリースでは、 プロセス1個につきオープンできるファイル数の上限は 64 です。> getdtablesize(2) システムコールで現在の限界を取得できます。

25 ENOTTY Inappropriate ioctl for device.
    「デバイスに不適切な ioctl です」 ファイルまたは特殊デバイスに不適切な操作を要求する制御関数 ( ioctl(2) を参照) を試みました。

26 ETXTBSY Text file busy.
    「テキストファイルがビジーです」 別のプロセスによって書込み用にオープンされた 純粋プロシージャ (共有テキスト) ファイルから新しいプロセスを作ろうとしたか、 または純粋プロシージャファイルが実行されている間に、書込みアクセスを要求する open(2) 呼び出しが実行されました。

27 EFBIG File too large.
    「ファイルが大きすぎます」 ファイルのサイズが最大値を超過しました (約 2.1E9 バイト)。

28 ENOSPC No space left on device.
    「デバイスの空き領域不足です」 該当するファイルシステムで新たなディスクブロックが利用できないために、 通常ファイルへの write(2) 処理、ディレクトリの作成、シンボリックリンクの作成、 ディレクトリエントリの作成が失敗しました。 または、該当するファイルシステムで新たな inode が利用できないために、 新しく作成するファイルに対する inode の割り当てが失敗しました。

29 ESPIPE Illegal seek.
    「不正なシークです」 lseek(2) システムコールがソケット、パイプ、または FIFO に対して実行されました。

30 EROFS Read-only file system.
    「読取り専用ファイルシステムです」 ファイルまたはディレクトリを変更しようとする試みが、 その時点で読取り専用であるファイルシステムに対して行われました。

31 EMLINK Too many links.
    「リンクが多すぎます」 1 つのファイルについて許容されるハードリンクの最大数を超過しました (1 ファイルにつきハードリンク数の限界は 32767 です)。

32 EPIPE Broken pipe.
    「パイプが破壊されてました」 データを読み取るプロセスのないパイプ、ソケット、または FIFO に対しての書込みです。

33 EDOM Numerical argument out of domain.
    「数値引数が領域外です」 数値入力引数が、数学関数の定義域の外側にありました。

34 ERANGE Result too large.
    「結果が大き過ぎます」 関数の数値結果が大きすぎて、利用できる場所に入りません (おそらく精度を超過したのでしょう)。

35 EAGAIN Resource temporary unavailable.
    「リソースが一時的に利用できません」 これは一時的な状況であり、後で同じルーチンを呼び出した時に 正常に完了する可能性があります。

36 EINPROGRESS Operation now in progress.
    「操作が現在進行中です」 完了するのに時間のかかる操作 ( connect(2) など) をノンブロッキングオブジェクトに対し試みました ( fcntl(2) を参照)。

37 EALREADY Operation already in progress.
    「操作は既に進行中です」 既に操作が進行中のノンブロッキングオブジェクトに対してさらに操作を試みました。

38 ENOTSOCK Socket operation on non-socket.
    「ソケットでないものについてソケット操作を行いました」 ここに書いてあるとおりです。

39 EDESTADDRREQ Destination address required.
    「宛先アドレスが要求されています」 ソケットに関する操作に際し、必要なアドレスが抜けています。

40 EMSGSIZE Message too long.
    「メッセージが長すぎます」 内部メッセージバッファ、または何らかのネットワーク上の制限より 大きなメッセージがソケットで送信されました。

41 EPROTOTYPE Protocol wrong type for socket.
    「ソケットに対するプロトコルのタイプが間違っています」 要求されたソケットタイプではサポートされないプロトコルが指定されました。 たとえば、タイプ SOCK_STREAM では、 ARPA インターネット UDP プロトコルを使用できません。

42 ENOPROTOOPT Protocol not available.
    「プロトコルが利用できません」 getsockopt(2) 呼び出しまたは setsockopt(2) 呼び出しで、間違ったオプションまたはレベルが指定されました。

43 EPROTONOSUPPORT Protocol not supported.
    「プロトコルがサポートされていません」 指定したプロトコルがシステム内に組み込まれていないか、 またはそのプロトコルの実装が存在しません。

44 ESOCKTNOSUPPORT Socket type not supported.
    「ソケットタイプがサポートされていません」 指定したソケットタイプがシステム内に組み込まれてないか、 またはそのソケットタイプの実装が存在しません。

45 EOPNOTSUPP Operation not supported.
    「操作がサポートされていません」 引数が指すオブジェクトのタイプは、指定した操作をサポートしていません。 このエラーが起きるのは、通常は、ファイル記述子がこの操作を サポートできないファイルまたはソケットを参照しているときです。 たとえば、データグラムソケット上で接続を accept しようしたときです。

46 EPFNOSUPPORT Protocol family not supported.
    「プロトコルファミリがサポートされていません」 指定したプロトコルファミリがシステムに組み込まれていないか、 またはそのプロトコルファミリの実装が存在していません。

47 EAFNOSUPPORT Address family not supported by protocol family.
    「アドレスファミリがプロトコルファミリによってサポートされていません」 要求したプロトコルと互換性のないアドレスが使用されました。 たとえば、 ARPA インターネットプロトコルで NS アドレスを使用できるとは必ずしも期待すべきではないでしょう。

48 EADDRINUSE Address already in use.
    「アドレスが既に使用中です」 各アドレスごとに、一度に 1 つだけを利用できます。

49 EADDRNOTAVAIL Cannot assing requested address.
    「要求されたアドレスを割り当てできません」 通常は、このマシン上にないアドレスでソケットを作成しようとした結果です。

50 ENETDOWN Network is down.
    「ネットワークがダウンしています」 ソケット操作の結果、動作していないネットワークに遭遇しました。

51 ENETUNREACH Network is unreachable.
    「ネットワークに到達できません」 到達できないネットワークに向けてソケット操作を試みました。

52 ENETRESET Network dropped connection on reset.
    「リセットによりネットワークの接続が失われました」 接続していたホストがクラッシュして再起動されました。

53 ECONNABORTED Software caused connection abort.
    「ソフトウェアによる接続中断が生じました」 自マシン側の原因により接続中断が発生しました。

54 ECONNRESET Connection reset by peer.
    「接続が通信相手によってリセットされました」 接続が通信相手 (peer) によって強制的にクローズされました。 これはタイムアウトまたは再起動によって、 リモート側のソケットで接続が失われた結果であるのが普通です。

55 ENOBUFS No buffer space available.
    「バッファの空きがありません」 システムに十分なバッファがないか、待ち行列が一杯になったために、 ソケットまたはパイプについての操作が行われませんでした。

56 EISCONN Socket is already connected.
    「ソケットは既に接続されています」 既に接続されたソケットに対して connect(2) 要求を行いました。 または、接続済みのソケットに対する sendto(2) や sendmsg(2) 要求に際し、既に接続されているのに宛先を指定しました。

57 ENOTCONN Socket is not connected.
    「ソケットは接続されていません」 ソケットが接続されておらず、しかも (データグラムソケットを送信するときに) アドレスが指定されていなかったために、データを送信または 受信する要求が許可されませんでした。

58 ESHUTDOWN Cannot send after socket shutdown.
    「ソケットのシャットダウンの後で送信ができません」 以前に shutdown(2) を呼び出して既にシャットダウンさせてしまったために、 ソケットに対しデータを送信する要求が許可されませんでした。

60 ETIMEDOUT Operation timed out.
    「操作がタイムアウトしました」 ある時間が経過するまでに接続相手が適切に応答しなかったために、 connect(2) 要求または send(2) 要求の処理に失敗しました (タイムアウトの期間は通信プロトコルに左右されます)。

61 ECONNREFUSED Connection refused.
    「接続が拒絶されました」 接続相手のマシンが接続を自ら拒否したので、接続を確立できませんでした。 これは、通常、相手ホストで有効でないサービスに接続しようとした結果です。

62 ELOOP Too many levels of symbolic links.
    「シンボリックリンクのレベルが多すぎます」 パス名の探索に、32 (MAXSYMLINKS) を越えるシンボリックリンクが含まれていました。

63 ENAMETOOLONG File name too long.
    「ファイル名が長すぎます」 パス名の構成要素が {NAME_MAX} 文字を越えているか、またはパス名全体が {PATH_MAX} 文字を越えています ((pathconf) 2 の中の _PC_NO_TRUNC の解説も参照して下さい)。

64 EHOSTDOWN Host is down.
    「ホストがダウンしています」 宛先ホストがダウンしているためにソケット操作が失敗しました。

65 EHOSTUNREACH No route to host.
    「ホストへの経路はありません」 到達不可能なホストにソケット操作をしようとしました。

66 ENOTEMPTY Directory not empty.
    「ディレクトリが空ではありません」 ディレクトリ削除または名前変更の呼び出しに対し、 ‘’. と ‘..’ 以外のエントリを含むディレクトリが指定されました。

67 EPROCLIM Too many processes.
    「プロセスが多すぎます」

68 EUSERS Too many users.
    「ユーザが多すぎます」 クォータシステムがテーブルエントリを使い切りました。

69 EDQUOT Disc quota exceeded.
    「ディスククォータが超過しました」 ユーザのディスクブロッククォータを使い尽くしたために、通常のファイルへの write(2) 、ディレクトリの作成、シンボリックリンクの作成、 ディレクトリエントリの作成が失敗しました。 もしくは、ユーザの inode クォータを使い尽くしたために、 新しく作成されたファイルのための inode の割り当てに失敗しました。

70 ESTALE Stale NFS file handle.
    「失効した NFS ファイルハンドルです」 オープンされている ( NFS ファイルシステム上の ) ファイルに対してアクセスしようとしましたが、 指定したファイル記述子が参照するファイルは現在利用できません。 これは NFS サーバ上でファイルが削除されたか、 または他の破滅的な何かが起きたことを示していると思われます。

72 EBADRPC RPC struct is bad.
    「RPC 構造体が不良です」 RPC 情報の交換が不成功でした。

73 ERPCMISMATCH RPC varsion wrong.
    「RPC バージョンが間違っています」 通信相手の RPC のバージョンが、こちらのバージョンと互換性がありません。

74 EPROGUNAVAIL RPC prog. not avail.
    「RPC プログラムが利用できません」 要求したプログラムがリモートホストに登録されていません。

75 EPROGMISMATCH Program version wrong.
    「プログラムバージョンが間違っています」 要求したバージョンのプログラムが、リモートホスト (RPC) 上で利用できません。

76 EPROCUNAVAIL Bad procedure for program.
    「プログラムにとって間違った手続きです」 リモートプログラム内に存在しない手続きに対し RPC 呼び出しが試みられました。

77 ENOLCK No locks available.
    「ロックが利用できません」 システムが課した、同時ファイルロック数の制限に達しました。

78 ENOSYS Function not implemented.
    「関数が実装されていません」 このシステムで利用できないシステムコールを実行しようとしました。

79 EFTYPE Inappropriate file type or format.
    「ファイルの型または形式が不適切です」 操作が誤った型のファイルに行われたか、またはデータファイルの 形式が誤っています。

80 EAUTH Authentication error.
    「認証エラーです」 NFS ファイルシステムをマウントするために不正な 認証チケットを使おうとしました。

81 ENEEDAUTH Need authenticator.
    「認証物が必要です」 指定した NFS ファイルシステムをマウントするために認証チケットが必要です。

82 EIDRM Identifier removed.
    「識別子は削除されました」 IPC の識別子は、現在のプロセスがそれで待っている間に削除されました。

83 ENOMSG No message of desired type.
    「要求された型のメッセージがありません」 要求した型のメッセージが IPC メッセージキューにありません。 または、メッセージカタログは要求したメッセージを含んでいません。

84 EOVERFLOW Value too large to be stored in data type.
    「データタイプに格納するには大きすぎる値です」 関数からの数値の戻り値が、呼び出し側で用意した場所に格納するには大きすぎます。

85 ECANCELED Operation canceled.
    「処理はキャンセルされました」 予定されていた処理はキャンセルされました。

86 EILSEQ Illegal byte sequence.
    「不正なバイト列です」 多バイト文字をデコードしている際に、関数は不正または不完全なバイト列 もしくは不正なワイド文字に遭遇しました。

87 ENOATTR Attribute not found.
    指定された拡張属性は存在しません。

88 EDOOFUS Programming error.
    関数や API を、実行時にしか検知されない方法で誤用しました。

定義

プロセス ID (Process ID)
    システム内のアクティブな各プロセスは、プロセス ID と呼ばれる 負でない整数によって一意に識別されます。 この ID の範囲は 0 から 99999 までです。

親プロセス ID (Parent process ID)
    新しいプロセスは、現在のアクティブなプロセスから作成されます ( fork(2) を参照)。 プロセスの親プロセス ID は、 最初はそれを作成したプロセスのプロセス ID となっています。 そのプロセスを作成したプロセスが exit した場合、 それぞれの子プロセスの親プロセス ID は、システムプロセス init(8) の ID に設定されます。

プロセスグループ (Process Group)
    アクティブなプロセスはそれぞれがあるプロセスグループのメンバであり、 プロセスグループはプロセスグループ ID と呼ばれる 負でない整数によって識別されます。 プロセスグループ ID はそのグループのリーダのプロセス ID です。 このグループ化によって、 関連づけられたプロセスの集団にシグナルを送る ( termios(4) を参照) ことや、 csh(1) のジョブ制御機構を可能にします。

セッション (Session)
    セッションは 1 つ以上のプロセスグループの集合です。 セッションは setsid(2) の呼び出しが成功すると作成されます。 これによって、呼び出したプロセスは、新規のセッションが 1 つだけ持つプロセスグループの唯一のメンバになります。

セッションリーダ (Session leader)
    setsid(2) の呼び出しの成功によって、新しいセッションを作成したプロセスは、 セッションリーダとして知られます。 端末を自分が制御する端末 ( termios(4) を参照) として取得できるのは、セッションリーダだけです。

制御プロセス (Controlling process)
    制御端末を持つセッションリーダが制御プロセスです。

制御端末 (Controlling terminal)
    セッションに関連づけられている端末は、そのセッションとそのメンバに対する 制御端末として知られます。

端末プロセスグループ ID (Terminal Process Group ID)
    端末は、セッションリーダによって制御端末として取得されます。 ひとたび端末がセッションに関連づけられると、 端末プロセスグループ ID をプロセスグループの ID に設定することによって、 そのセッション内のどのプロセスグループでも、 フォアグラウンドに置くことができるようになります。 この機能は、同じ端末をめぐり競合している複数のジョブの間で 調停を行うために用いられます ( csh(1) と tty(4) を参照)。

親のないプロセスグループ (Orphaned Process Group)
    プロセスグループは、ジョブ制御を行うシェルの制御下にない場合、 親なしになった とみなされます。 より正確に言うと、そのプロセスグループのメンバはどれも、 そのグループと同じセッションに属す親プロセスを持たず、かつ、 親プロセスが別のプロセスグループに属す場合、 そのプロセスグループは親なしになります。 なお、プロセスが終了するとき、その子プロセスの親プロセスは init(8) となるように変更されます。 そしてこれは別個のセッションになります。 親のないプロセスグループのメンバの全てが、必ずしも 親のないプロセス (プロセスを作成したプロセスが終了した) というわけではありません。 この定義により、セッションリーダのプロセスグループは親なしになります。

実ユーザ ID と実グループID (Real User ID and Real Group ID)
    システム上の各ユーザは、実ユーザ ID と呼ばれる正の整数によって識別されます。

    各ユーザは、1 つまたは複数のグループのメンバでもあります。 これらのグループの 1 つは他のものから区別され、 アカウンティング機能を実現するのに使用されます。 この区別されたグループに対応する正の整数は、実グループ ID と呼ばれます。

    すべてのプロセスは実ユーザ ID と実グループ ID を持っています。 これらは、そのプロセスを作成したプロセスと等価な属性値を 使って初期化されます。

実効ユーザ ID、実効グループ ID、グループアクセスリスト (Effective User Id, Effective Group Id, and Group Access List)
    システムリソースへのアクセスは、実効ユーザ ID とグループアクセスリストという 2 つの値を使って決定されます。 グループアクセスリストの最初のメンバは、実効グループ ID としても知られています (POSIX.1 では、グループアクセスリストは、補助グループ ID の セットとして知られ、実効グループ ID がリストのメンバで あるかどうかは未規定です)。

    実効ユーザ ID と実効グループ ID は、最初はそれぞれ、 プロセスの実ユーザ ID と実グループ ID です。 いずれも (おそらくその先祖のいずれかが) ユーザ ID 設定ファイルまたは グループ ID 設定ファイルを実行することにより変更することができます ( execve(2) を参照してください)。 慣習で、実効グループ ID (グループアクセスリストの最初のメンバ) は複製されるので、 グループ ID 設定プログラムの実行の結果、もともと持っていた (実) グループ ID が失われることはありません。

    グループアクセスリストは、リソースへのアクセスが可能かどうかを 決定するためにだけ使用されるグループ ID の集合です。 アクセスチェックは、以降の ``ファイルアクセスパーミッション'' で説明するように行われます。

保存されたセットユーザ ID と保存されたセットグループ ID (Saved Set User ID and Saved Set Group ID)

退避ユーザ ID と退避グループ ID (Saved Set User ID and Saved Set Group ID)
    プロセスが新しいファイルを実行するとき、ファイルがユーザ ID 設定であれば、 実効ユーザ ID はそのファイルの所有者に設定され、 ファイルがグループ ID 設定であれば、 実効グループ ID (グループアクセスリストの最初の要素) は ファイルのグループに設定されます。 それからプロセスの実効ユーザ ID は退避ユーザ ID として記録され、 プロセスの実効ユーザ ID は退避グループ ID として記録されます。 これらの記録された値は、実 ID ( setuid(2) を参照) に戻った後で、実効ユーザ ID または実効グループ ID をこれらの 値に回復するために利用できます。 (POSIX.1 では、退避ユーザ ID と退避グループ ID はオプションであり、 setuid および setgid の内部で使用されますが、 これはスーパユーザについて意図どおりには機能しません)。

スーパユーザ (super-user)
    実効ユーザ ID が 0 の場合、そのプロセスは スーパユーザ プロセスとして認識され、特別な権利が認められます。

記述子 (Descriptor)
    open(2), dup(2) によってファイルが参照されるとき、または pipe(2), socket(2), socketpair(2) によってソケットが作成されるときにシステムによって割り当てられる整数です。 この整数は、指定のプロセスやその子プロセスから、 そのファイルやソケットへのアクセスパスを一意に識別します。

ファイル名 (File Name)
    最高 {NAME_MAX} 文字からなる名前であって、通常ファイル、特殊ファイル、 ディレクトリに名前を付けるのに使用されます。

    これらの文字は、NUL (ASCII 0) および ‘/’ 文字 (スラッシュ、 ASCII 47) を除く、 任意の 8 ビット値から選択できます。

    なお、一般に、ファイル名の一部として ‘*’, ‘’?, ‘[’, ‘’] を使用するのは賢明ではありません。 シェルによってこれらの文字には特殊な意味がつけられるからです。

パス名 (Path Name)
    パス名は、 NUL で終端された文字列です。 スラッシュ ‘/’ (省略可能) で始まり、スラッシュで区切られた 0 個以上のディレクトリ名が続き、 ファイル名 (省略可能) が続きます。 パス名の長さの合計は {PATH_MAX} 文字未満である必要があります (あるシステム上では、この制限は無制限かもしれません)。

    パス名がスラッシュで始まる場合、パス検索はルートディレクトリから 開始します。 そうでない場合、検索は現在の作業ディレクトリから開始します。 スラッシュだけの場合、ルートディレクトリを指定します。 空のパス名は現在のディレクトリを指します。

ディレクトリ (Directory)
    ディレクトリは特殊なタイプのファイルであり、他のファイルを参照する エントリを含んでいます。 ディレクトリエントリをリンクと呼びます。 伝統的に、ディレクトリには少なくとも 2 つのリンク、 ‘’. と ‘..’ を含みます。 これらはそれぞれ ドット および ドット-ドット と呼ばれます。 ドットは、そのディレクトリ自体を指し、 ドット-ドットはその親ディレクトリを指します。

ルートディレクトリと現在の作業ディレクトリ (Root Directory and Current Working Directory)
    各プロセスは、ルートディレクトリと現在の作業ディレクトリという 概念を持つとされてきました。 これらの概念はパス名検索を解決する際に用いられます。 プロセスのルートディレクトリは、 ルートファイルシステムのルートディレクトリである必要はありません。

ファイルアクセスパーミッション (File Access Permission)
    ファイルシステム内の各ファイルはアクセスパーミッションの 集合を持っています。 これらのパーミッションは、プロセスがファイルについて要求された操作 (たとえば、書込み用にファイルをオープンする) を行ってもよいかどうかを 判定するのに使用されます。 アクセスパーミッションはファイルが作成されたときに設定されます。 アクセスパーミッションは chmod(2) 呼び出しを用いて後から変更することもできます。

    ファイルアクセスでは、ファイルが読取りが許されているかどうか、 書込みが許されているかどうか、実行が許されているかどうか、によって 分類されます。 ディレクトリファイルでは、ディレクトリを検索してもよいかどうかを 制御するのに実行パーミッションを使用します。

    システムがファイルアクセスパーミッションを解釈するにあたり、 ユーザの 3 つの異なるクラス (ファイルの所有者、 ファイルのグループ内のユーザ、その他) のどれに適用するかによって解釈します。 各ファイルは、これらの各クラスについて、 独立したアクセスパーミッションの集合を持っています。 アクセスチェックが行われると、システムは、 呼び出し側に適用できるアクセス情報をチェックすることによって、 パーミッションが認可されるかどうかを判定します。

    ファイルについての読取り、書込み、実行 / 検索の 各パーミッションは、次の場合にプロセスに認可されます。

    プロセスの実効ユーザ ID がスーパユーザである場合 (注: スーパユーザであっても、実行可能でないファイルを実行する ことはできません)。

    プロセスの実効ユーザ ID がファイルの所有者のユーザ ID に一致し、 所有者のパーミッションがアクセスを許可している場合。

    プロセスの実効ユーザ ID がファイルの所有者のユーザ ID と一致せずに、 プロセスの実効グループ ID がファイルのグループ ID と一致するか またはファイルのグループ ID がプロセスのグループアクセスリスト内に あるかのどちらかであり、グループパーミッションがアクセスを許容している場合。

    プロセスの実効ユーザ ID も実効グループ ID もグループアクセスリストも、 ファイルの対応するユーザ ID およびグループ ID と一致しないが、 ``その他のユーザ'' のパーミッションがアクセスを許容する場合。

    上記のいずれにも該当しない場合、パーミッションは拒絶されます。

ソケットとアドレスファミリ (Sockets and Address Families)
    ソケットはプロセス間の通信の端点です。 各ソケットには、データ送信用および受信用の待ち行列があります。

    ソケットには、通信の性質によったタイプがあります。 これらの性質には、ソケットで送受信されるメッセージに 相手の名前が必要かどうか、通信に信頼性があるかどうか、 メッセージ受信者を名付ける際に使用される形式などが含まれます。

    実際のシステムはそれぞれ、いくつかのソケットタイプの集合をサポートしています。 利用できるタイプおよびそれらのプロパティの詳細については、 socket(2) を参照してください。

    実際のシステムはそれぞれ、いくつかの通信プロトコルの集合を サポートしています。 プロトコルの集合はそれぞれある特定の形式のアドレスをサポートします。 アドレスファミリは、あるプロトコルのグループに対応するアドレスの集合です。 ソケットはそれぞれ、ソケットが作成されたアドレス ファミリから選択したアドレスを持ちます。

関連項目
intro(3), perror(3)