sysopen

ファイル、パイプ、ディスクリプタを開く

構文

解説

sysopen は、FILENAME に与えられたファイル名のファイルを開き、 FILEHANDLE と関連付けます。 成功すれば真を返し、失敗すれば undef を返します。

基本的に sysopenopen のファイルアクセス機能と同様の機能を持ちますが、sysopen は OS の open(2) を呼び出していることもあり、パラメータの仕様も含め、より OS に近い関数です。 そして、sysopenopen とは異なり、コマンドの実行など、ファイルを開く以外の機能はありません。

MODE の値は、open で使う <> とは異なり、 OS に依存します。OS による違いを吸収するために標準モジュール Fcntl の定数を使うのが一般的です。

use Fcntl;

sysopen my $fh, './sample.txt', O_RDONLY
  or die "読み取り専用モードでファイルを開くことができませんでした: $!\n";

MODE に指定可能な定数の変数名とその意味は下表のとおりです。

定数 説明
O_RDONLY 読み取り専用モードでファイルを開きます。
O_WRONLY 書き込み専用モードでファイルを開きます。
O_RDWR 読み書き両用モードでファイルを開きます。

上記のモードにいくつかのモードを組み合わせることが可能です。 組み合わせる際には O_WRONLY|O_APPEND|O_CREAT のように | で連結します。 代表的なモードをいくつか挙げます。

定数 説明
O_APPEND 追加モードでファイルを開きます。 ファイルを開いた際にポインタがファイルの先頭にセットされます。
O_ASYNC シグナル駆動 I/O を有効にします。 ファイルディスクリプタで入力または出力が可能になったとき、 シグナル (デフォルトでは SIGIO) を生成します。
O_CREAT ファイルが存在しなければファイルを生成します。
O_EXCL O_CREAT と組み合わせて使ったとき、 すでにファイルが存在すればエラーになります。
O_NOFOLLOW ファイルがシンボリックリンクならエラーになります。
O_TRUNC ファイルが存在し、かつ、書き込みが許されたモード (O_RDWR または O_WRONLY) なら、 サイズが 0 となるようファイルが切り詰められます。

次の例は、追加書き込みモードでファイルを開きますが、もしファイルが存在しなければ新規に生成します。

sysopen my $fh, './sample.txt', O_WRONLY|O_APPEND|O_CREAT;

sysopen はファイルを生成する場合はパーミッションを 8 進数で指定することができます。 ただし、umask の影響を受けます。 指定がない場合は 0666 が適用されます。

次の例では、書き込み専用モードで新規にファイルを生成する際に、パーミッションに 0606 を指定しています。

sysopen my $fh, './sample.txt', O_WRONLY|O_CREAT, 0606;

もし umask の値が 022 なら、 最終的にパーミッションが -rw----r-- (0604) の sample.txt が生成されます。