• ベストアンサー

lockfについて

charmer29-2の回答

  • ベストアンサー
回答No.3

再び#2です。 確かにlockf()はO_RDONLYではダメかもしれませんね。 ファイル全体のアドバイザリロックでいいのなら、flock()の方が簡単ですよ。 簡単なサンプルを提示しておきます。 -- // for read int get(const char * fileName) { int rtn; FILE * fp = fopen(fileName, "r"); if (fp == NULL) return -1; // 読んでる間に読むのはいいが、書くのは許さん if (flock(fileno(fp), LOCK_SH) != 0) return -1; if (fscanf(fp, "%d", & rtn) < 1) return -1; flock(fileno(fp), LOCK_UN); fclose(fp); return rtn; } // for write int set(const char * fileName, int value) { FILE * fp = fopen(fileName, "w"); if (fp == NULL) return -1; // 書いている間は書くことも読むことも許さん if (flock(fileno(fp), LOCK_EX) != 0) return -1; if (fprintf(fp, "%d\n", value) < 0) return -1; if (fflush(fp) < 0) return -1; flock(fileno(fp), LOCK_UN); fclose(fp); return 0; } -- 注: ・ストリームを使った出力の場合、フラッシュしない限り書き出しが留保される可能性があるのでロック解除前に必ずフラッシュすること。 ・このサンプルではエラー時にファイルをクローズしていない。 ・このサンプルではブロックが発生する。必要ならLOCK_NBをorすること。 ・flock()が使えずfcntl()が使えるなら、簡単なラッパ関数を用意すればflock()互換にできる。

noname#21460
質問者

お礼

ご回答の内容は見ていたのですが お礼が遅くなりましてすみません。 大変役にたちました。 ありがとうございます。

関連するQ&A

  • OSがHP-UX 11i のsendmail

    OSがHP-UX 11i のsendmailについて教えてください。 HP-UX 11iのrootに送付されたメールを他のメールサーバに転送 したいのですがどのようにしたらよいかご教授して頂きたくよろしく お願いいたします。 HP-UX 11iにはsendmail自体は、インストールした記憶がないので すがすでにプロセスが起動しております。(バージョン不明) aliaseファイルにrootにきたファイルを転送したいメールアドレス に設定しnewaliaseコマンドを実行するのはわかるのですが、どの メールサーバに転送するという設定がくわしくわかりません。 【質問1】 sendmail.cfまたはsendmail.mcを修正するのはわかるのですが 設定方法がいまいち分かりません。(HP-UX 11iの場合) 【質問2】 sendmail以外にインストールソフトがございますでしょうか? (コンパイルするソフト等必要でしょうか?) よろしくお願いいたします。

  • ロックファイルが消える

    ファイルロックにflockを使っているのですが、複数のファイルを扱うので、データファイルにロックをかけるのではなく別途「ロックファイル」に対してロックをかけています。 データファイルであれば読み書きモードで開く必要がありますが、ロックファイルは中身はどうでも良いので、 open(LOCK,"> $lockfile") or die ~ というように上書きモードで開いて良いとする解説を読んだので、そのようにしています。 しかし、ごくたまにロックファイルが消えてしまう現象が発生します(なかなか再現できずに条件など特定できず)。 あくまでもファイルの中身が壊れるとかいうことではなくて、ファイルそのものが消えます。 そこでお聞きしたいのですが、 1. ロックをかけたファイルが何らかの原因で消えた場合、ロック状態も消失してしまう(他プロセスがロックできてしまう)のでしょうか? 試してみたのですが、  まずプロセスAがロックをかけて  プロセスBが同ファイルにロックをかけようとすると、失敗する  プロセスAがロック解除せずにファイルを削除する  それでもプロセスBはロックに失敗する  プロセスAが(もう存在しないファイルの)ロックを解除(close)する  するとプロセスBはロックに成功する ということは分かったのですが、上記を、プロセスAがファイルを削除した後にプロセスBを動かすと、どういうわけかロックに成功してしまいます。 2. 複数プロセスが同時に上書きモードでopenしようとするのが消える原因なら、ロックファイルであってもやはり読み書きモードで開くべきなのでしょうか。そしてそれなら消えることは無いのでしょうか。 (読み込みモードではロックできないという解説もありました。) 御教授のほどよろしくお願いいたします。

  • Javaで自分のプロセスIDが取得したい

    Java言語でバッチアプリケーションを製作しています。 "自分のプロセスIDと同じ名前のファイルを検索する"必要があるのですが、Javaでそのようなことができるのでしょうか。 自分のプロセスIDが"1234"だとしたら、対象ディレクトリの"1234"というファイルを検索するというようなものです。 OSはWindowsXPまたはHP/UXです。

    • ベストアンサー
    • Java
  • PerlとPHPで同一ファイルをファイルロック

    PerlとPHPで同一のファイルを読み書きする必要があるのですが、ファイルロックする機構を作るには互いの言語でmkdirで対応したほうがよいのでしょうか? flock関数がPerlにもPHPにもありますが、これは、PHPのプロセスで実行したロックの状態をPerlで検知したり、または逆のことはできないのでしょうか? もしできないとするとmkdirで同一の機構を作ったほうが良い気もしますが、何か問題などは起きないでしょうか。

    • ベストアンサー
    • PHP
  • Linux環境におけるgetprocs関数

    お疲れ様です、初めてLinux環境で開発(C言語)している者です。 流用元(HP-UX環境/C言語)のソースをコンパイルしたところ、 「getprocs」(プロセス情報の取得?)という関数でエラーになりました。 <procinfo.h>というヘッダをincludeしているのですが、 このヘッダファイルも見当たりません。 Linuxでは、使用できない関数なのでしょうか? また、代替手段などあるのでしょうか? getprocs自体、ネットで調査してもあまり有力な情報をヒットできず、苦慮してます。 ご存じの方おりましたら、ご教授よろしくお願いいたします。

  • ファイルが削除できません。

    あるファイルがプロセスによってロックされているため削除できません。 どのプロセスがロックしているか調べる方法はありますでしょうか? OS:WindowsXP よろしくお願いいたします。

  • JNIからCのメッセージキューが使用できない

    JAVAからJNIを使用してC言語の関数呼び出しを行っています。 C側の関数は内部でmsgrcv()とmsgsnd()を呼び出しているのですが、どちらも処理が正常終了しているにもかかわらず、メッセージ自体の送信(受信)ができていません。しかしながらメッセージ長は正常に取得できている状態です。 このような現象でどういったことが考えられるのでしょうか。 環境は OSがHP-UX11、 JDKのバージョンが1.5です。 宜しくお願い致します。

  • ファイルのロックについて

    C言語初心者です。OSはHP-UXを使っています。 AプログラムXXXファイルに書込みます。 しかし、BプログラムではXXXファイルを読込みます。 Aのプログラムが書込んでいる最中、Bは読込ませたくありません。 lockfにてAプログラムでXXXファイルをロックしているのですが BプログラムではXXXファイルを読む事ができます。 なぜでしょうか? BプログラムでもXXXファイルをlockfする必要がありますか? よろしくお願いします。

  • UNIXのCPU負荷の自動検知法

    HP-UX11ですが、1日に1回、1分間だけCPUの負荷が100% 近くになってしまいとても困っています。 原因となるプロセス名はわかっているので本来はそのバグ を修正すべきなのでしょうが、事情がありそれがなかなか 出来ない状態なので、CPUに負荷がかかったらそのプロセス を殺すとしくみを自動検知で作りたいのですが、その検知 方法がわかりません。 PSをポーリングするというのはそ れ自体が負荷となるのでNGです。 よろしくお願いします。

  • 共有メモリでのデータ読み書きについて

    Linuxで共有メモリを複数プロセスで読み書きする場合について質問させて頂きます。 CPUは32ビットで、共有メモリ上の、int(32ビット)の領域を 複数のプロセスで読み書きする場合を想定した場合、 セマフォ等でロックした方が良いのでしょうか? または、CPUが1命令で読み書きすることが可能 (と思っていますが、違っていればご指摘お願い致します)なので、 セマフォ等のロックをかけなくても、問題はないものなのでしょうか? 割りと良くありそうな疑問だと思ったのですが、 ウェブで調べた限りでは該当する質問はありませんでしたので、 質問させて頂きました。 ご回答宜しくお願い致します。