• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:flockの挙動がおかしい。。。)

flockの使用による子プロセスの終了とロックの問題

kumozの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

> system("./lock.pl $_ &");   ↓  system("./lock.pl $_"); 通常は system 関数が終わるまで待ちますが、バックグラウンドで子プロセスを起動しているため終了を待たないためと思います。& を消せば、すべての sleep がなくても順番どおりに実行されるはずです。

azicyan
質問者

お礼

回答ありがとうございました。 説明不足で申し訳ありません。 多重で実行したいので&をつけております。

関連するQ&A

  • flockについて

    PHPを始めようと思っていきなりつまずいています。 flockについてなんですが <?php $fp = fopen("ファイル名","a"); flock($fp,LOCK_EX); fputs($fp,"aaa"); flock($fp,LOCK_UN); fclose($fp); ?> は正しいですが $fp = fopen("ファイル名","w") とかにしてしまうとファイルロックの意味がありませんよね (ロックする前にファイルを丸めてしまってて、このプロセスの後readすると実際と異なる値を読んでしまうから) で、この場合 (つまり"w"や"w+"をファイルオープンの引数にとってflockするとき) fopen の前に、ロックを示すためのディレクトリを作成しておいて、書き込んだ後にディレクトリを削除する、というような独自の仕組みを作る必要があると思うんですが、具体的にどういうソースになるか教えてください

    • ベストアンサー
    • PHP
  • flockのファイル保持について

    一つのブラウザで以下のプログラムを動かしつつ、、 ---- lock.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); flock($fp, LOCK_SH); ?> ここでしばらく待つ。 <?php sleep(30); flose($fp); ?> ------------------ もう一つのブラウザで ---- if.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); // ・・・(1) if(!flock($fp, LOCK_EX)){ print ("ロックされています。<BR>"); }else{ print ("ロックされていません。<BR>"); } ?> ------------------ を動かしました。 期待していた結果は 「ロックされています。」の表示です。 ですが、lock.phpプログラムの終了を、(1)の部分で待っているようで、lock.phpプログラムが終了後、「ロックされていません。」の表示になります。 ロックされていたらすぐに「ロックされています。」の表示を出したいのですが、どうしたらいいでしょうか?何か勘違いをしている部分があればご教授ください。

    • 締切済み
    • PHP
  • 【ruby】flockで掛けたロックを参照したい

    複数プロセス間で、一つのファイルに対して読み書きしたいです。 その際、ファイルへの書き込み中は、ファイルの読み込みを抑止したいです。 また、読み込みの処理はファイルのロックを参照するだけで、ファイルへのロックは掛けない様にしたいです。 そこで、以下二つプログラムを作成して、簡単な検証を行いました。 ■プログラム1 キーボードからの入力があるまで、ファイルをロックする。 #!/usr/local/bin/ruby file='./hoge.txt' f=open(file,'r+') ret=f.flock(File::LOCK_EX|File::LOCK_NB) STDOUT.write 'Hit any key' STDIN.gets.chomp ■プログラム2 ファイルがロックされているか状態を取得する。 #!/usr/local/bin/ruby require "fcntl" file='./hoge.txt' f=open(file,'r') arg="" f.fcntl(Fcntl::F_GETLK,arg) l_start,l_len,l_pid,l_type,l_whence = arg.unpack('VVVSS') puts l_len ※プログラム2は、fcntlの使い方がマニュアルを読んでもよく理解できなかったので、 手探りで記述しました。 実行すると、プログラム1はエラー無く動きましたが、プログラム2は以下の様なエラーが 出てしまいます。 fcntl.rb:6:in `fcntl': Invalid argument - ./hoge.txt (Errno::EINVAL) from fcntl.rb:6 環境は、unixレンタルサーバ(FreeBSD)です。 上記方法では、上手くいきませんでした。 flockでファイルにロックが掛っているか否かを、そのファイルにロックを掛けることなく 調べるにはどうしたら良いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • ファイルのロックについて

    ファイルのロック方法を下記の様にしてロックさせていますが、同時ににアクセスが合ったときにどちらかが$add_text;を書きこまれないので順次書き込まれる様にしたいのですが、何方かご教授してもらえませんか? #!/usr/bin/perl use Fcntl ':flock'; open(ADD_DB,">>$log"); flock(ADD_DB, LOCK_EX); print ADD_DB "$add_text;\n"; flock(ADD_DB, LOCK_NB); close(ADD_DB);

    • ベストアンサー
    • Perl
  • Perlの多重起動を禁止したい

    main_01.plというプログラムがあります。 これは10分毎にバッチファイルから起動の命令が下ります。ただしプログラムの処理によっては10分以上かかることがあります。 この時、main_01.pl がすでに起動していた場合、main_01.pl はすぐに exit; になるように組みたいのです。僕が考えた方法は、あるテキストファイルにロックをかけ、そのファイルがロック中であるならばプログラムは処理を行わずすぐに終了する、といった感じです。 =============================== # タイムアウト処理 my $timeout = 5; # 排他処理 my $lockfile="lock.txt"; # 多重起動停止 (ここに $lockfile が書き込めなかったらmain_01.plは別に起動していることになるので起動しない。) # 排他処理開始 open(LOCK,"$lockfile"); flock(LOCK,2); # 処理開始 eval { # タイムアウト local $SIG{ALRM} = sub { die "alarm\n" }; alarm( $timeout ); # プログラムスタート print "\n◆スタート\n\n"; sleep(4); # プログラム終了 print "\n◆終わりました。\n\n"; }; # タイムアウト処理 if ( $@ ) { # タイムアウト print "\nタイムアウトしました。TIMEOUT= $timeout \n"; } else { # タイムアウトせずに正常終了 print "\n正常終了しました。\n"; } # 排他処理終了 close(LOCK); exit;

    • ベストアンサー
    • Perl
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • DBMS_LOCK.SLEEPについて

    いつもお世話になっております。 PL/SQLパッケージにて、DBMS_LOCK.SLEEP()を使用したいのですが、 「DBMS_LOCKは宣言されてません。」とエラーになります。 DBMS_OUTPUTプロシージャに関しては正常に動作しているのですが、DBMS_LOCK.SLEEP()を使用するさいにインストールしなければいけないパッケージなどあるのでしょうか? 初心者で申し訳ありませんが、宜しくお願いします。

  • ページ訪問時の個別カウントについて

    こんばんは,いつもお世話になっております. Webサイトへのアクセスカウンターを作ってみました. 人がページへ訪問→+1してcount.datに加算→同ページに数値を表示というプロセスです. count.cgi ----------------------------------------- #! usr/bin/perl use CGI::Carp qw(fatalsToBrowser); open(FILE, "+<./count.dat") or die("ERROR"); eval{ flock(FILE, 2); }; $count = <FILE>; #カウントファイルの書き込み seek(FILE, 0, 0); print FILE ++$count; close(FILE); #サーバー出力 print qq[Content-type: text/html\n\n]; print qq[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">]; print qq[<html>]; print qq[<head><title></title></head>]; print qq[<body>]; print qq[$count]; print qq[</body>]; print qq[</html>]; ----------------------------------------- 非常に簡易的なものなのですが,この数値を個人のIPなど,無二の値を用いて識別し,count.datに保存することは可能でしょうか? もちろん個人情報なので出力については考慮したいと思っております. 何か不明な点がございましたら随時対応しますので,よろしくお願い致します.

  • file()を使う時のファイルロック

    たいていの場合は問題ないのですが、 アクセスカウンタ等の更新の激しい物の場合、 file()やfile_get_contents()でファイルを開き、 その内容を元にfopen()・flock()・fputs()等を使って書き込むと、 データが破損してしまう事があります。 これはロック中でもfile()等では開けてしまうのが原因だと思いますが、 file()等を使う際の排他処理はどのようにしたら良いのでしょうか。 ロック中は、fopen()の前で解放されるのを待つ仕様なようなので、 $fp=fopen("ロック用ファイル","r"); flock($fp,LOCK_EX); ~複数のファイルの読み書きを含めた、様々な処理~ fclose($fp); としてみたのですが、これで排他処理は完璧になるでしょうか? これまでは、 1. ロック用ファイルが存在する場合、なくなるまでsleep() 2. 空のロック用ファイルを作成 ~複数のファイルの読み書きを含めた、様々な処理~ 3. ロック用ファイルを削除 としていたのですが、これでは度々破損してしまいました。 「1」と「2」の間で、新しいプロセスが「1」に割り込んで来てしまうせいでしょうか。 そうだとすれば、fopen()とflock()の間でも 同じ事が起きてしまう気がするのですが、どうなんでしょうか。

    • 締切済み
    • PHP
  • perlプログラム

    (1)のプログラムではtest.txtの内容を表示することができました。 (2)ではaaaが表示されつづけると思いますが、何も表示されません。 なにかまちがっていると思いますが、わかりません。 よろしくお願いします。 --------------------------------------------------------------------------------- (1) --------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print $_; last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); ------------------------------------------------------------------------------- (2) ------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print "aaa";  ←変更箇所 last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); -------------------------------------------------------------------------------