![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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()互換にできる。
No.2
- 回答日時:
#1さんの回答を踏まえて。
強制ロックはHP-UXでは使えないかもしれません。
その辺りはHP-UXのマニュアルページで確認してください。
さて、では強制ロックする汎用的な方法はあるでしょうか。
結論から言うと、ありません。
ぐぐれば判ると思いますが、概ね次のようなアプローチがあります。
・対象ファイルの属性を変更する
・対象ファイル名を変更する
実際にはプロセスが中断したときのことなどを考えると色々厄介です。
そのファイルにアクセスするのが自分が掌握できるプロセスだけならアドバイザリロックでいいんですけどねぇ。
この回答への補足
ご回答ありがとうございます。
1つ記述するのを忘れていました。
1つのソースに共通関数としてそのファイルにアクセスする関数を全て記述しています。
(書込み側open関数,write関数,close関数、読込み側open関数,read関数,close関数)
また、書込み側、読込み側がそれぞれ1プロセスのみと制限しています。
であれば、強制ロックをしなくてもアドバイザリロックで
大丈夫と言う事でしょうか?
lockfは完全にロックするのかと思っていましたので、
書込む際にlockfをし、読み込み関数には入れていませんでした。
readする前にlockfをし、チェックを行えば問題なさそうですよね?
しかし、読込み側のopen処理はO_RDONLYでopenしているので
O_RDWRにしてあげなければならないのでしょうか?
No.1
- 回答日時:
普通に使うと、lockfは「アドバイザリーロック」になります。
つまりロックをかけたことをlockfが知らせるけど、そのロック情報は、競合するプロセスも同じくlockf関数を使って、「ロック中」「ロックしていない」を受け取ってくれることを前提にしています。だから、このルールを無視して読み書きするプログラムを書けば、自在にファイルを読み書きできてしまいます。
強制ロックにすれば、ロックのルールを無視したプログラムでも、読み書きできなくなるようですが、以下のURLを見るとその設定は面倒そうです。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
なお、このURLはLinuxのものであって、HP-UXのOSではないので、違っているかもしれませんけど。
ご回答ありがとうございます。
manを見てもlockfに前提のような記述が読み取れなかったので
完全にロックするのかと思っていました。
manを見る限りですと、権限をつけてあげないと
O_RDONLYではlockfを使用できないようですので
読込み側もO_RDRWに変更しなければいけないのですね。
読込む事しかしないので、できればO_RDONLYにしたかったのですが。
強制ロックは大変そうですね。
そこまではしなくても良いかなとおもいますので
読込み側にlockfをつけて制御してみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム 外付けHDDの初期化について 4 2023/03/05 21:19
- システム 外付けHDDの初期化について 4 2023/03/05 20:00
- フリーソフト AOMEI Backupper でバックアップが取れない 2 2022/07/17 22:28
- Excel(エクセル) ドキュメントに保存していたエクセルのファイルが開きません。 2 2022/12/02 09:38
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の課題です
-
C言語でのCSVソートとデータ抽...
-
C言語でファイルの内容を strto...
-
複数ファイルの同時読み込みの...
-
c言語 文字数のカウント 合わ...
-
CSVファイルの内容を構造体に格...
-
漢字を配列に入れたいのですが
-
a*(1-exp(-bx))+cの近似の方法
-
テキストファイルをバイナリフ...
-
【C言語】ファイルを読み込んで...
-
commons-netでのFTP送信について
-
数学 数直線の見方
-
10進数からN進数に変換するプロ...
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
int main()、void main()、void...
-
C言語 逆ピラミッドの作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
ファイル出力で改行を入れたい!
-
エラーがわかりません、、
-
テキストファイル内に対して, ...
-
構造体のメンバにファイルポイ...
-
C言語にてXMLファイルから任意...
-
ガンマ変換 C言語でプログラ...
-
日本語ファイル名のFTPについて
-
【C言語】ファイルを読み込んで...
-
fscanfでループしてしまう。
-
fgets( ) の返り値は何?
-
CRC32の計算方法
-
VisualStudioでのファイルの入...
-
ファイルに行番号を追加
-
ファイルへの書込み処理が異常...
-
ファイルが読み込めない・・・
おすすめ情報