MW211 EXIT

devlog
C/排他制御と書込オープン
2013年07月01日
「w」もしくは「w+」でfopen()する場合、
排他制御を「flock()」で行うと、「fopen()」→「flock()」の順なので
「flock()」前に更新(全クリア)が発生してしまい、うまく排他制御ができない。

「open()」のレベルで考えると、全クリアは「O_TRUNC」モード指定が該当する。
つまり、以下のような感じとなる。
┌──────────────────────────────────────┐
│fd = open(ファイル名,                                                       │
│          モード | O_TRUNC,                                                 │
│          権限);                                                            │
├──────────────────────────────────────┤
│if (flock(fd, LOCK_EX) == -1) {                                             │
│    排他制御中                                                              │
│}                                                                           │
└──────────────────────────────────────┘

この場合は、全クリアを「ftruncate()」にまかせて
「open()」の時点では全クリアをしないようにするのが鉄則ということだ。
┌──────────────────────────────────────┐
│fd = open(ファイル名,                                                       │
│          モード,                                                           │
│          権限);                                                            │
├──────────────────────────────────────┤
│if (flock(fd, LOCK_EX) == -1) {                                             │
│    排他制御中                                                              │
│}                                                                           │
├──────────────────────────────────────┤
│ftruncate(fd, 0);                                                           │
└──────────────────────────────────────┘
分類:C/C++