C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ファイル処理の排他について


(過去ログ 93 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■55811 / inTopicNo.1)  ファイル処理の排他について
  
□投稿者/ たっち (1回)-(2010/12/14(Tue) 22:32:41)

分類:[C/C++] 

ファイルの排他処理で思った動作にならず困っています。知恵をお貸し下さい。

一つのアプリでfopen( "rb" )を使ってファイルを開いている間に、別のアプリがfopen( "wb" )で書込みしようとしたとき
本来なら、読込で開かれているので書込みできないはずですが、現状できてしまっています。

何か他にコードを追記する必要があるのでしょうか?もしくは自分の勘違いであってfopenで読込中でも書込みできるのでしょうか?

開発環境
Windows XP
Visual Studio 6.0
C++

引用返信 編集キー/
■55812 / inTopicNo.2)  Re[1]: ファイル処理の排他について
□投稿者/ shu (288回)-(2010/12/15(Wed) 07:39:47)
No55811 (たっち さん) に返信

ファイルのロックはflockだったかな。
引用返信 編集キー/
■55815 / inTopicNo.3)  Re[2]: ファイル処理の排他について
□投稿者/ 774RR (571回)-(2010/12/15(Wed) 09:09:54)
まず fopen など FILE* を扱う標準関数は UNIX 由来なので、その挙動も UNIX 的である。
fopen に排他指定はないので fopen だけでは排他オープンできないことになっている。
伝統的に UNIX 上では fopen(.. "r") の後に fopen(.. "w") した場合には開けてしまう。

UNIX では NFS と言って異なるマシン上のファイルをあたかもローカルに持っているかのごとく
取り扱えるようになっている都合で(開けて、読み書きできて、閉じられる)
いわゆる [ファイル単位] でのロックはあまり用いられない、という点も大きい。

ロックについて考察するときは常に粒度を考える必要がある。
ファイル単位のロックは flock (ただし NFS 上のファイルに対しては無効)
バイト単位のロックなら lockf (こちらは NFS 上のファイルに対しても有効)
ただしすべての UNIX (特に Linux 以外の商用 UNIX) が両者をともに使えるとは限らない。
# Visual C++ 6.0 に lockf や flock あったっけ?

Visual studio 2005 とかだと fopen の排他指定可能版 fopen_s ってのが用意されているが
これは Microsoft 固有の拡張であって ISO/IEC 9899 には無い・・・

で、今回の話で、具体的にどうしたらいいのか?は、どうしたいのか?という要件次第。

引用返信 編集キー/
■55854 / inTopicNo.4)  Re[3]: ファイル処理の排他について
□投稿者/ たっち (2回)-(2010/12/15(Wed) 23:39:02)
shuさん、774RRさんご回答有難う御座います。

fopenの中でcreatefileを読んでると言う事を聞いたことがあったので排他周りも勝手にやってる物だと
思い込んでいました。テストプログラムで何度やっても排他が掛からなかったので本当のところはどうなのか
ハッキリさせたくて書込みをしました。

>>shuさん
ファイルのロックはflockで出来るようですが時間がとれずまだ調べただけになってます。
折角情報くださったのにすいません、時間を作って必ずやってみます。

>>774RRさん
非常に詳しく書いていただいて有難うございます。
軽い気持ちで質問したのですが、掘り下げていくと結構な勉強になりそうなので時間かけて勉強してみます。
VS2005でfopen書くと「定義がうんたらかんたら〜」とワーニングが出てきました。
Microsoft的にはfopen_s使ってほしいのかな
解決済み
引用返信 編集キー/
■55868 / inTopicNo.5)  Re[4]: ファイル処理の排他について
□投稿者/ ちゃっぴ (64回)-(2010/12/16(Thu) 15:16:47)
ちゃっぴ さんの Web サイト
Microsoft 的には Win32 CreateFile だと思いますけど。

CreateFile Function
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
解決済み
引用返信 編集キー/
■55871 / inTopicNo.6)  Re[5]: ファイル処理の排他について
□投稿者/ 774RR (572回)-(2010/12/16(Thu) 15:39:12)
Visual C++ の C Runtime Library は、もちろん fopen の中から CreateFile を呼んでいる。
でも ISO/IEC 9899 互換の fopen を使うと CreateFile の FILE_SHARE_*** が勝手にくっつくので
非排他モードになる、というのが正しい動作。
で、実際正しい動作である 「排他されない」 を示している。

どう解決するかはどういう案件かで違うと既に書いたとおりで、

・fopen は排他で開くか?が知りたいだけ=答えは既に出ているとおり排他しない
・排他なしで開きたい=もう解決

・排他で開きたいのであればさらに案件を整理すべきで
 ・そのソースは ISO/IEC 9899 互換で書く必要があるのか? (fopen は使えるが open や CreateFile はだめ)
 ・そのソースは POSIX 互換で書く必要があるのか? (fopen, open は使えるが CreateFile はだめ)
 ・そのソースは Windows 固有の書き方になっていいのか? (fopen_s や CreateFile を使うってよいか?)
 あるいは
 ・本当にファイル単位での排他が必要か? レコード単位の排他なのか?
 あるいは
 ・バッファリングが必要か (fopen で内部的に採られるストリームバッファが必要か)
  CreateFile で開いてしまうと fopen がしているようなストリームバッファは自前で用意する必要がある

などなどで最終的にどう実装するかはまったく違う可能性がある。
俺としては「CreateFile をつかったら?」なんて安易に答えたくない。

解決済み
引用返信 編集キー/
■55874 / inTopicNo.7)  Re[6]: ファイル処理の排他について
□投稿者/ shu (300回)-(2010/12/16(Thu) 17:03:25)
774RRさんのご指摘通りflockはVCにはないようです。間違っていました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -