新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: ファイルロック試験
Date: 1998/02/02 19:22:31
Reference: mesh.forum.3/00064

2月1日に、Radcliffeさんは書きました。

>実行結果全文です。
>
書き込みエラーの原因は分かった様で、今回の事はwww2sサーヴァの問題では無いと
言うことで一安心なのですが、まあ、将来のこともありますので、もうチョット
おつきあい下さい。(^^)

>HP-UX bgsv105 B.10.20 A 9000/889 233824361 two-user license
>
今の所は、まだ、HP-UX 10.20を使っているようですね。

>This is perl, version 4.0
>
>$RCSfile: perl.c,v $$Revision: 4.0.1.8 $$Date: 1993/02/05 19:39:30 $
>Patch level: 36
>
S号機のperl4も4.036で1号機と同じ様ですね。
これはperl4の最終ヴァージョンなのでまあ安心です。

>This is perl, version 5.003 with EMBED
>        built under hpux at Feb 10 1997 14:42:28
>        + suidperl security patch
>
あ、いーなー S号機のperl5は5.003+suidperlパッチなのか。
この辺のヴァージョンは比較的良いはずです。少なくとも1号機の
5.001無印みたいにバグバグではない。(^^)

さて、Radcliffeさんは「うぇぶ会議室」の実行にどちらのヴァージョンのperlを
使っていますか? つまりスクリプトの最初の行の「#!/usr/local/bin/perl」と
言うのを変更していますか、いませんか?

既に「#!/usr/local/bin/perl5」に変更済みでしたら、以下は蛇足だと思います。

先の記事に書いたように、HP-UX等ではperl4とperl5とではflock()に関する
動作が異なるはずです。確かに手元のHP-UX9.07マシンではそうなるし、S号機でも
初期の頃はそうだという事を確認してました。

その後、S号機がSetUIDで動いている事に目を奪われていて (^^;; エラー報告が
あった時に perl4 で動かしているのかどうかをチェックするのを忘れていました。
と言うことで、出来れば現在のS号機の状態を確認しておきたいので、以下の簡単な
スクリプトを実行していただけませんか?


#!/bin/sh - exec 2>&1 echo "Content-Type: text/plain" echo tmpfile="/tmp/locktest.tmp" perl4="/usr/local/bin/perl" perl5="/usr/local/bin/perl5" script='open(FILE, "+<$ARGV[0]") || exit(1); flock(FILE, 6) || exit(2); sleep(5); flock(FILE, 8) || exit(3); close(FILE) || exit(4); exit(0);' touch $tmpfile chmod 666 $tmpfile ($perl4 -e "$script" "$tmpfile" ; echo "perl4,1=$?") & ($perl4 -e "$script" "$tmpfile" ; echo "perl4,2=$?") & wait ($perl5 -e "$script" "$tmpfile" ; echo "perl5,1=$?") & ($perl5 -e "$script" "$tmpfile" ; echo "perl5,2=$?") & wait rm $tmpfile exit 0
内容は、perl4、perl5のそれぞれに付いてファイルロックの試験をして、その 結果を返します。例えば、1号機(SunOS4.1.3_U1)で実行すると、 perl4,1=2 perl4,2=0 perl5,1=2 perl5,2=0 となり、perl4、perl5のどちらも正常にflock()が働いているのが確認できます。 # ,1と,2のどちらかが正常終了(=0)、他方がロック不可(=2)なら正常です。 手元のHP-UX9.07のサーヴァで実行すると、 The flock() function is unimplemented on this machine at /tmp/perl-ea07418 line 2. perl4,1=2 The flock() function is unimplemented on this machine at /tmp/perl-ea07420 line 2. perl4,2=2 perl5,2=2 perl5,1=0 となり、perl5ではflock()が利きますが、perl4にはflock()がインプリメント されていないのが分かります。