C言語でロックするには?

[上に] [前に] [次に]
ちか 1999/04/21(水) 04:59:33
C言語でロックする場合、どんな方法を使ってますか?
flockが使えなくて、困っています。

B-Cus 1999/04/21(水) 05:14:12
symlinkやmkdirが定番かと思います。使い方は簡単なので省略。

ちか 1999/04/23(金) 05:04:19
やはりsymlinkなどを使うしか無いのでしょうか?
symlinkを使って、自作のflockもどきを作ってみましたが、
やっぱり使いにくいのです。

プログラム全体の表現力が落ちるというか、、、
大変読みにくいプログラムに成ってしまいます。
もっと良い方法は有りませんか?

ちか 1999/04/23(金) 05:05:46
あ、御礼を忘れてましたです。
B-Cusさん、わざわざありがとうございます。

B-Cus 1999/04/23(金) 13:45:02
そうですか? 読みにくいかなぁ。

まぁ、ロックファイルが残ったときの処理は面倒ですが、
(perlですが)以下のような関数を作ってしまえば、あとは
lock_on、lock_offを呼ぶだけなのですが。

sub lock_on {
 my $lock_flg = 0;
 $SIG{TERM}=$SIG{PIPE}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off;
 LOOP:
 foreach ( 1..3 ){
  foreach ( 1..3 ){
   $lock_flg = symlink("$$",$lockfile);
   if ( $lock_flg ){ last LOOP; }
   sleep 1;
  }
  if ( ! $lock_flg ){
   if ( ! -d "/proc/".readlink($lockfile) ){
    unlink($lockfile);
   }
  }
 }
 if ( ! $lock_flg ){
  print "ロックファイルを作成できませんでした。\n";
  exit;
 }
}

sub lock_off {
 unlink($lockfile);
}


> もっと良い方法は有りませんか?

socketをbindする処理も排他的なので、ロック処理はできます。
これはプロセスがこけても後には残りませんね。でもポート番号の
選択部分で苦労しそうな気もします。

コルン 1999/04/29(木) 02:01:56
 ごうに来ればごうに従え、か。
 うむ、オイラも少し前に、Cでつまずいた所だねぇ。
 でも取り敢えず、自分で解決しました。
 どこかのCGIに使われてたとか言う訳では無いので、
動作の保証は出来ませんが。(一応、オイラはこれで
上手く行っています)


FILE *f_in,*f_out;
int retry=5;

while(rename("file.dat","in.tmp")){/*ここで、ロック*/
  retry--;
  if(retry<1){
    /*エラー処理*/
  }
  sleep(1);
}
if(!(f_in=fopen("in.tmp","r"))){
  /*エラー処理*/
}
if(!(f_out=fopen("out.tmp","w"))){
  /*エラー処理*/
}
/*
  ここに、f_inから読み込んで、f_outに出力するプログラムを書く
*/
fclose(f_in);
remove("s_in.tmp");

fclose(f_out);
rename("out.tmp","file.dat");/*ここで、ロック解除*/


 いかがでしょうか?
 たぶん、ロックは完璧だと思うんですけど?
 ちなみに、テンポラリーファイルの名前は、ロックす
るファイルごとに違うものにして下さい。(上のプログラム
では、in.tmpとout.tmp)
 また、ファイルを全部メモリに読み込むのがイヤで考え
た方法ですので、バッファ一つで事足りる場合が多いと
思います。読み込みながら、書き込みが出来るのが、
この方法の最大の強みだと思われます。


 ふと思ったんですけど、ファイルを2つ同時に開くのと、
ファイルを1つ開いて、バッファを数十キロバイトも取るのって、
どっちが負担が少なくて、速いんでしょうねぇ?

[上に] [前に] [次に]