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つ開いて、バッファを数十キロバイトも取るのって、
どっちが負担が少なくて、速いんでしょうねぇ?
[上に]
[前に]
[次に]