文件锁

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

int wlock(int fd, int wait) {
    struct flock lock;
    // 操作类型 F_RDLCK 读锁, F_WRLCK 写锁, or F_UNLCK 解锁
    lock.l_type = F_WRLCK;
    // 相对哪个位置 SEEK_SET 开头位置 SEEK_CUR 当前位置 末尾 SEEK_END
    lock.l_whence = SEEK_SET;
    // 偏移多少
    lock.l_start = 0;
    // 多少长度 0 表示整个文件
    lock.l_len = 0;
    //哪个进程给文件加锁 -1表示当前进程
    lock.l_pid = -1;

    return fcntl(fd, wait ? F_SETLKW : F_SETLK, &lock);
}

int unlock(int fd) {
    struct flock lock;
    // 操作类型 F_RDLCK 读锁, F_WRLCK 写锁, or F_UNLCK 解锁
    lock.l_type = F_UNLCK;
    // 相对哪个位置 SEEK_SET 开头位置 SEEK_CUR 当前位置 末尾 SEEK_END
    lock.l_whence = SEEK_SET;
    // 偏移多少
    lock.l_start = 0;
    // 多少长度 0 表示整个文件
    lock.l_len = 0;
    //哪个进程给文件解锁 -1表示当前进程
    lock.l_pid = -1;
    return fcntl(fd, F_UNLCK, lock);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        perror("参数错误。用法:./main 字符串");
        return -1;
    }
    /*各种文件操作
     * int fcntl (int __fd, int __cmd, ...)
     * __fd 文件句柄
     * __cmd 文件操作函数
     * ... 文件操作函数的参数
     * */
    int f = open("./lock.txt", O_RDWR | O_CREAT | O_APPEND, 777);
    char *s = argv[1];
    if (wlock(f, 1) == -1) {
        perror("wlock");
        return -1;
    }
    for (int i = 0; i < strlen(s); i++) {
        write(f, &s[i], sizeof(s[i]));
        sleep(1);
    }
    if (unlock(f) == -1) {
        perror("unlock");
        return -1;
    }
    close(f);

    return 0;
}

posted on 2023-02-27 11:40  信奉上帝的小和尚  阅读(8)  评论(0编辑  收藏  举报

导航