For Development HEAD DRAFTSearch (procedure/syntax/module):

9.11 gauche.fcntl - 低レベルファイル操作

Module: gauche.fcntl

fcntl(2)を含む、低レベルのファイルシステム操作のインタフェースを提供します。

Function: sys-fcntl port-or-fd operation :optional arg

{gauche.fcntl} port-or-fd で指定されたファイルに対して特定の操作をおこないます。 ファイル指定は、ポートオブジェクトもしくはシステムのファイルディスクリプタ である整数でなくてはなりません。それがポートである場合には、すでにオープン されたファイルを結びついていなければなりません。 (port-typefile を返すようなポートということです。 ポート共通の操作参照。)

操作は整数 operation で指定します。 いくつかの変数が定義されいて、operation に使用できます。

F_GETFD

port-or-fd のファイルディスクリプタに結びついているフラグを返します。 オプション引数のargは使われません。返り値は整数で、その定義はシステム によります。ただし、FD_CLOEXECだけは例外で、これはexecで クローズされたことを示しています。 詳しくはあなたのシステムのfcntl(2)のマニュアルエントリを 参照してください。

F_SETFD

port-or-fdのファイルディスクリプタのフラグを与えられたargに します。たとえば、FL_CLOEXECフラグを設定する、互換性のある方法では 次のようにします。

(sys-fcntl port F_SETFD
          (logior FD_CLOEXEC
                  (sys-fcntl port F_GETFD)))
F_GETFL

port-or-fdによって指定されたオープンしたファイルに結びついている フラグを返します。このフラグには以下のような情報が含まれています。

  • ファイルのアクセスモード。O_ACCMODE でマスクしたとき、 これは、O_RDONLYO_WRONLYO_RDWRのうちどれかひとつです。
  • ファイルの作成オプション。O_CREATO_EXCLのどちらか、または両方。 O_TRUNC.
  • O_APPENDでマスクしたとき、追記が許されているかどうか。
  • forkした時にファイルが自動的にクローズされるかどうか。
  • O_NONBLOCKでマスクしたとき、I/O が非ブロックモードかブロックモードか。
  • O_NOCTTYでマスクしたとき、端末制御を切離しているかどうか。
  • パス名が指しているものがシンボリックリンクなら、システムコールがELOOPで 失敗するようにする。

システムが、そのシステム特有のフラグを定義していることがあります。

F_SETFL

port-or-fdで指定したオープンされたファイルのフラグを設定します。 上に列挙されたフラグのうち、O_NONBLOCKO_APPEND だけが 変更可能です。

F_GETFD/F_SETFD はファイルディスクリプタそのものに結びついた フラグについてであり、一方、F_GETFL/F_SETFL はオープンされた ファイルそのものに結びついているフラグについての操作であることに注意して ください。この違いは、2つ以上のファイルディスクリプタが同じオープンされた ファイルを指しているような場合にあらわれます。

F_DUPFD

port-or-fdで参照しているのと同じファイルを指す新しいファイル ディスクリプタを生成します。 argで整数を与えなければなりません。この数は割り当てられる ファイルディスクリプタの最小値を指定します。

F_GETLK

3つめの引数を与えなければなりません。これは、以下に述べる<sys-flock> オブジェクトのインスタンスでなければなりません。argで指定された ロック情報を検索し、それにしかるべく変更します。

F_SETLK
F_SETLKW

3つめの引数を与えなければなりません。これは、以下に述べる<sys-flock> オブジェクトのインスタンスでなければなりません。argにしたがって、 アドバイザリロックを設定します。ロックの取得に成功すれば、#tが 返ります。もし、別のプロセスがロックをもっていて要求したものと衝突した 場合には F_SETLK のときは #f を返します。一方、F_SETLKW のときはロックが利用可能になるまで待ちます。

F_GETOWN

当該ファイルディスクリプタ上のイベント用シグナル、SIGIO および SIGURG を 受けとることになるプロセスのプロセスIDあるいはプロセスグループを返します。 プロセスグループは負の値で表示されます。このフラグはシステムにこのような 機能がある場合にのみ利用可能です(BSD や Linux にはこの機能があります)。

F_SETOWN

当該ファイルディスクリプタ上のイベント用シグナル、SIGIO および SIGURG を 受けとることになるプロセスのプロセスIDあるいはプロセスグループを設定します。 プロセスグループは負の値で表示されます。このフラグはシステムにこのような 機能がある場合にのみ利用可能です(BSD や Linux にはこの機能があります)。 詳細については、お使いのシステムの fcntl(2) のマニュアルページをチェック してください。

これ以外の値を operation で指定しようとするとエラーになります。

Builtin Class: <sys-flock>

{gauche.fcntl} POSIX のアドバイザリレコードロックを表わす構造体です。アドバイザリレコードロック というのは、適切なロックをもたないプロセスが対象ファイルを操作しても システムは関知しない、ということです。すべてのプロセスが、共有される可能性 のあるファイルを操作する前にロックをfcntlを使って検査することが 期待されています。

fcntlによるロックは、プロセスごと、ファイルごとであることに注意してください。 同一プロセス内で同じファイルを複数回ロックすることはできますが、再帰ロックではないので いずれかのロックがアンロックされるか、どこかでそのファイルがクローズされるかすると プロセスはそのファイルに対するロックを失います。これは、fcntlロックを ライブラリで使うことを難しくします。プロセス間排他制御を実現する別の方法として with-lock-file (ロックファイル参照) があります。

Instance Variable of <sys-flock>: type

ロックのタイプを表す整数です。利用可能な値として以下の変数があらかじめ 定義されています。

F_RDLCK

読み込みのロック

F_WRLCK

書き込みのロック

F_UNLCK

F_SETLKによるロックを除去するか、あるいはレコードがF_GETLK でロックされていないことを示す。

Instance Variable of <sys-flock>: whence

startの計測が開始される位置を示す。

Instance Variable of <sys-flock>: start

ロックされる領域の開始位置オフセット

Instance Variable of <sys-flock>: len

ロックされるバイト数。ゼロは「EOFまで」という意味。

Instance Variable of <sys-flock>: pid

当該のロックをもっている整数のプロセスID。F_GETLKでのみ使用。

Function: sys-open path flags :optional mode

{gauche.fcntl} POSIX open()への低レベルインタフェースです。 pathで指定されるファイルをオープンして、整数のファイルディスクリプタを返します。 ファイルディスクリプタはsys-closeでクローズするか、 open-{input|output}-fd-oprtでポートに変換して ポートがクローズされた時に一緒にクローズすることができます。

この手続きはfdを直接触る必要がある低レベルコードのために提供されています。 どうしても必要な場合以外には、高レベルのopen-{input|output}-fileを使ってください。

flags引数は次のビットマスクの論理和です: O_RDONLY, O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC, O_CLOEXEC, O_NOCTTY, O_NOFOLLOW, O_NONBLOCK, O_ASYNC。 このうちO_RDONLY, O_WRONLY, O_RDWRのどれかひとつは 指定しなければなりません。

mode引数はファイルが新たに作られた時のパーミッションです。 デフォルトは#o664です。

Function: sys-statvfs path
Function: sys-fstatvfs port-or-fd

{gauche.fcntl} POSIX statvfsおよびfstatvfsへのインタフェースです。

path、もしくはport-or-fdに結びついたファイルが存在するファイルシステムの情報を 下に説明する<sys-statvfs>のインスタンスとして返します。

これらの手続きは対応するPOSIXシステムコールが提供されているシステムでのみ 定義されます。使えるかどうかは、機能識別子gauche.sys.statvfsで 検査できます (機能条件式参照)。

(cond-expand
  [gauche.sys.statvfs
    (... code using sys-statvfs ...)]
  [else
    (... alternative code ...)])
Builtin Class: <sys-statvfs>

{gauche.fcntl} POSIXのstruct statvfsです。 機能識別子 gauche.sys.statvfsが提供されている場合のみ定義されます。

Instance Variable of <sys-statvfs>: bsize

ファイルシステムのブロックサイズ。

Instance Variable of <sys-statvfs>: frsize

フラグメントサイズ。

Instance Variable of <sys-statvfs>: blocks
Instance Variable of <sys-statvfs>: bfree
Instance Variable of <sys-statvfs>: bavail

ファイルシステムが格納できるブロック数、未使用ブロック数、 非特権ユーザが使える未使用ブロック数を、frsizeを単位として表します。

Instance Variable of <sys-statvfs>: files
Instance Variable of <sys-statvfs>: ffree
Instance Variable of <sys-statvfs>: favail

ファイルシステム中の全inode数、未使用inode数、非特権ユーザが使える未使用inode数です。

Instance Variable of <sys-statvfs>: fsid

ファイルシステムID。正確な整数です。

Instance Variable of <sys-statvfs>: flag

正確な整数。ビットフラグのORです。 ポータブルなビットフラグ値として、定数ST_NOSUIDST_RDONLYが定義されています。

Instance Variable of <sys-statvfs>: namemax

ファイル名の長さの上限。

Constant: ST_NOSUID
Constant: ST_RDONLY

{gauche.fcntl} <sys-statvfs>flagスロットに使えるビットフラグ値です。 これらは機能識別子 gauche.sys.statvfsが提供されている場合のみ定義されます。

ST_NOSUIDビットが立っていたら、exec(3)はこのファイルシステム中のファイルの suidビットとsgidビットを無視します。

ST_RDONLYビットが立っていたら、このファイルシステムは読み取り専用でマウントされています。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT