|
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 をつかったら?」なんて安易に答えたくない。
|