Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 標準関数
  3. here

sysopen関数 - オープンモードを詳細に指定

sysopen関数を使用すればオープンモードを詳細に指定することができます。open関数のオープンモード以上のことを行いたい場合に利用できます。

sysopen(my $fh, $file, O_WRONLY | O_EXCL | O_CREAT) 

Perlのsysopenは、C言語のfopenと同等の関数です。第1引数にファイルハンドル、第2引数にファイル名、第3引数に、オープンフラグを指定します。必要であれば第4引数にパーミッションを8進数で指定でき、デフォルトのパーミッションは 0666です。

オープンフラグは、ビット演算子 | で結ぶことで複数指定できます。オープンフラグの組み合わせでオープンモードを指定します。

たとえば、ファイルが存在していなければ作成して書き込みモードでオープンということをしたいとしましょう。

open関数では、書き込みモードでオープンしたいが、ファイルが存在していれば上書きしないという動作を実現することができません。O_WRONLY | O_EXCL | O_CREAT をオープンモードに指定すれば、これを実現できます。

O_WRONLY は書き込みモードという意味で、O_CREAT はファイルが存在しない場合に新規作成するという意味です。O_EXCLはファイルが存在するとエラーという意味です。O_EXCLが、O_CREATよりも優先されて、ファイルが存在する場合はエラーになります。存在しない場合は作成されます。

オープンフラグを表すシンボルを使うためにはあらかじめインポートしておく必要があります。

use Fcntl;

Fcntlモジュールを使用すると、O_WRONLY などのシンボルが使用できます。sysopen関数を使うときは、セットで使用すると覚えておきましょう。

オープンモードの種類

O_RDONLY 読み込み
O_WRONLY 書き込み
O_RDWR 読み書き両用
O_CREAT ファイルが存在しなければ作成する。
O_EXCL ファイルが存在すればopenを失敗させる
O_APPEND 追加書き込み
O_TRUNC ファイルを0バイトに切り詰める

Perlのopen関数は、"<", ">",">>" などわかりやすい記号を使ってオープンモードを指定することができます反面、C言語のopen関数のようにオープンモードの詳細な指定をすることができません。

sysopen関数を使えば、オープンモードを細かく指定することができます。( パーミッションも指定することができますが、ファイルのアクセス権について書くときに触れたいと思います。)

サンプル

オープンモードを詳細に指定するサンプルです。

use strict;
use warnings;

# オープンモードをシンボルで指定するためのモジュール
use Fcntl;

my $file = shift; # ファイル名を指定。

# ファイルが存在していなければ作成して書き込みモードでオープン
sysopen(my $fh, $file, O_WRONLY | O_EXCL | O_CREAT) 
  or die "Couldn't open $file : $!";
close( $fh );