ファイル、パイプ、ディスクリプタを開く
sysopen は、FILENAME に与えられたファイル名のファイルを開き、
FILEHANDLE と関連付けます。
成功すれば真を返し、失敗すれば undef を返します。
基本的に sysopen は open
のファイルアクセス機能と同様の機能を持ちますが、sysopen は OS の
open(2)
を呼び出していることもあり、パラメータの仕様も含め、より OS に近い関数です。
そして、sysopen は open
とは異なり、コマンドの実行など、ファイルを開く以外の機能はありません。
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 が生成されます。