MW211 EXIT

devlog
C言語/fcntl()による排他制御・実例
2013年06月08日
読込系処理で共有ロックをかける場合の処理の流れ
┌──────────────────────────────────────┐
│int           fd;                                                           │
│struct flock  ファイルロック構造体;                                         │
├──────────────────────────────────────┤
│fd = open(ファイル名,                                                       │
│          O_RDONLY,                                // 読込専用でオープンする│
│          0444);                                                            │
│if (fd == -1) {                                                             │
│    オープン失敗;                                                           │
│    exit(EXIT_FAILURE);                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│ファイルロック構造体.l_type   = F_RDLCK;                       // 共有ロック│
│ファイルロック構造体.l_whence = SEEK_SET;                                   │
│ファイルロック構造体.l_start  = 0;                                          │
│ファイルロック構造体.l_len    = 16;                                         │
│戻り値 = fcntl(fd,                                                          │
│               F_SETLK,                                    // ロックをかける│
│               &ファイルロック構造体);                                      │
│if (戻り値 == -1) {                                                         │
│    他でロック中を検出;                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│読込処理など                                                                │
├──────────────────────────────────────┤
│close(fd);                                             // アンロックも兼ねる│
└──────────────────────────────────────┘
・ファイル先頭から16バイト分の領域についてロックを行う
────────────────────────────────────────
書込系処理で排他ロックをかける場合の処理の流れ
┌──────────────────────────────────────┐
│int           fd;                                                           │
│struct flock  ファイルロック構造体;                                         │
├──────────────────────────────────────┤
│fd = open(ファイル名,                                                       │
│          O_RDWR,                                  // 読書両用でオープンする│
│          0666);                                                            │
│if (fd == -1) {                                                             │
│    オープン失敗;                                                           │
│    exit(EXIT_FAILURE);                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│ファイルロック構造体.l_type   = F_WRLCK;                       // 排他ロック│
│ファイルロック構造体.l_whence = SEEK_SET;                                   │
│ファイルロック構造体.l_start  = 0;                                          │
│ファイルロック構造体.l_len    = 16;                                         │
│戻り値 = fcntl(fd,                                                          │
│               F_SETLK,                                    // ロックをかける│
│               &ファイルロック構造体);                                      │
│if (戻り値 == -1) {                                                         │
│    他でロック中を検出;                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│書込処理など                                                                │
├──────────────────────────────────────┤
│close(fd);                                             // アンロックも兼ねる│
└──────────────────────────────────────┘
・ファイル先頭から16バイト分の領域についてロックを行う
分類:C/C++