- PR -

Mac OSXとLinuxの環境について。

1
投稿者投稿内容
numao
常連さん
会議室デビュー日: 2007/01/28
投稿数: 28
お住まい・勤務地: 東京
投稿日時: 2007-06-19 00:55
 こんにちは。おひさしぶりです。

 最近作業環境をMac OSXに移してみたのですが、Perlで書いたものが一部機能しないのです。OSXは殆どUNIXベースでできていて、Linuxで動いているものは大抵動くんだろう…という見込みがあったのですが、何だかちょっとばかり違うみたいです。
 原因はわからないのですが、たぶんflockです。(他は綺麗に動いています。)

umask 0;
open(DATA, ">>$example");
flock(DATA,2);
seek(DATA, 0,0);
print DATA "$data1\n";
truncate (DATA, tell(DATA));
close(DATA);

こんな簡単な部分です。
flockが使えるようにできるにはOSXの場合はどうしたらよいのでしょうか?
できればシンボリックを使いたくないです。
Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2007-06-19 06:26
おはようございます。

期待する動作と実際の動作を教えていただけますか?
あとperlのバージョンも。

ちなみに、>> で追記モードで open すると、
seek(FH, 0, 0) してもファイルの先頭には
移動できないと思いますが、問題ないですか?
numao
常連さん
会議室デビュー日: 2007/01/28
投稿数: 28
お住まい・勤務地: 東京
投稿日時: 2007-06-19 13:42
Ayさんお世話になります。
verはperl, v5.8.1-RC3

期待する動作は、ファイルに一行書き込み(ロックをかけて)だけなんです。追加書き込みなので、末行に書き加えられてゆく動作です。
ロックをかけるほどアクセスが重複する…というのは今のところなくて、問題なく使えるのですが、flockに関して気になるところです。

#flock(DATA,2);
#seek(DATA, 0,0);
print DATA "$data1\n";
#truncate (DATA, tell(DATA));
コメントアウトすると普通に追加書き込みできます。

追加モードだと、ポインタは元に戻らないですね(笑)。意味がない…。。。。

別のスクリプトで書き込みをしている部分では、
こんなのがあります。
umask 0;
open (TMP, "> $tempfile");
flock (TMP, 2);
seek (TMP, 0, 0);
print TMP "$text_all\n";
truncate (TMP, tell(TMP));
open (LOG, "< $logfile");
flock (LOG, 2);
seek (LOG, 0, 0);
while (<LOG>) {
print TMP $_;
}
truncate (LOG, tell(TMP));
close (LOG);
close (TMP);
rename ($tempfile, $logfile);

追加モードではなくて、ちょっといろいろいじって新しい書き込みがファイルの一番上に来るように細工していあるものです。この場合だとflockがあってもなくても正常に作動しているようです。

先日まで、Win環境でCGIを制作していてサーバーにアップロードする…ということをしていたのですが、ここ最近Mac OSXに作業環境を変えました。
Win環境でのPerlのスクリプトはパスを変えるだけで一応Linux(FC5)でもちゃんと動いてました。Mac OSXについてまだまだ不十分な知識しかない…というのが原因ですが…。


1

スキルアップ/キャリアアップ(JOB@IT)