C言語システムコール-flock

flockシステムコール

概要

flockは指定ファイルをロックします。


flockでは共有ロックおよび排他ロックが設定できます。

共有ロックは、複数のプロセスが同時にファイルに対してロックを設定可能であるが、他プロセスからの排他ロックを拒否します。

排他ロックは、他プロセスからのロック処理(共有及び排他)を拒否します。


flockは同一ホスト上でファイルロックを行います。

NFSなどでホスト間共有されたファイルに対してロックを行う場合には、fcntl(F_SETLKW)システムコールやCライブラリのlockf()を利用する必要があります。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

/*!
 * @brief    入力まで待ち合わせる
 */
static void
wait_input(void)
{
    char buf[BUFSIZ] = {"¥0"};
    read(0, buf, sizeof(buf));
    return;
}

/*!
 * @brief     排他ロックする。
 * @param[in] fd    ファイルディスクリプタ
 * @return    0:success/-1:failure
 */
static int
exclusive_lock(int fd)
{
    int rc = 0;

    rc = flock(fd, LOCK_EX);
    if(rc < 0){
        printf("Error: flock() lock: %s\n", strerror(errno));
        return(-1);
    }

    /* 待ち合わせ処理 */
    fprintf(stdout, "Locked...\n");
    fprintf(stdout, "Press <Enter> to release lock.\n");
    wait_input();

    /* ロック解除 */
    rc = flock(fd, LOCK_UN);
    if(rc < 0){
        printf("Error: flock() unlock: %s\n", strerror(errno));
        return(-1);
    }

    fprintf(stdout, "Unlocked.\n");

    return(0);
}

/*!
 * @brief     ファイルをロックする。
 * @param[in] filepath  ファイルパス名
 * @return    0:success/-1:failure
 */
static int
file_lock(char *filepath)
{
    int rc = 0;
    int fd = 0;

    fd = open(filepath, O_RDWR);
    if(fd < 0){
        printf("Error: open() %s: %s\n", strerror(errno), filepath);
        return(-1);
    }

    rc = exclusive_lock(fd);
    if(close(fd) < 0){
        printf("Error: close() %s\n", strerror(errno));
        return(-1);
    }

    return(rc);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 2){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = file_lock(argv[1]);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ