MW211 EXIT

devlog
C言語/UNIX系の排他制御
2013年02月26日
UNIXのファイル排他制御機構としては、「fcntl()」と「flock()」がある。
「fcntl()」は細かくてややこしいので置いといて「flock()」について。

基本的な仕様としては以下のような感じ。
┌──────────────────────────────────────┐
│flock(*ファイルポインタ, LOCK_SH);  …共有ロック                            │
│flock(*ファイルポインタ, LOCK_EX);  …排他ロック                            │
│flock(*ファイルポインタ, LOCK_UN);  …アンロック(fclose()でもやってくれる)  │
└──────────────────────────────────────┘
「fopen()」で「*ファイルポインタ」を取得するので、
そいつを指定してロックをかけたり、はずしたり(アンロック)する。

流れとしてはこんな感じか。
┌──────────────────────────────────────┐
│FILE *fp = fopen("出力ファイル.txt","a");  // 追加モードでOPEN              │
│flock(*ファイルポインタ, LOCK_EX);         // 排他ロック                    │
│fwrite("追加", sizeof("追加"), 1, *fp);    // 追加書込                      │
│fclose(*fp)                                // CLOSEと共にアンロック         │
└──────────────────────────────────────┘

ちなみに、以下みたいに、排他の種別を変更することができる。
┌──────────────────────────────────────┐
│flock(*fp, LOCK_SH);                                                        │
│flock(*fp, LOCK_EX)                                                         │
└──────────────────────────────────────┘
でも、実体としては一回アンロックを挟んでいるので、
他にロックをとられる場合がありうる。
分類:C/C++