文件I/O-fcntl

定义

函数声明

flock结构体



建议锁


强制锁


实例

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>


void lock_set(int fd, int type)
{
    // 设置lock结构体
    struct flock lock;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;
    lock.l_type = type;

    // 根据不同的type值, 设置文件锁
    if (fcntl(fd, F_SETLK, &lock) == 0)
    {
        if (lock.l_type == F_RDLCK)
        {
            printf("read lock already set by %d.\n", getpid());
        }
        else if (lock.l_type == F_WRLCK)
        {
            printf("write lock already set by %d.\n", getpid());
        }
        else if (lock.l_type == F_UNLCK)
        {
            printf("release lock by %d\n", getpid());
        }
        else 
        {
            printf("error l_type.\n");
        }
    }
    else
    {
        // 判断文件不能设置锁的原因
        fcntl(fd, F_GETLK, &lock);
        /*判断文件不能上锁的原因*/
        if(lock.l_type == F_UNLCK)
            printf("no lock by %d\n",lock.l_pid);
        /*/该文件已有写入锁*/
        if(lock.l_type == F_RDLCK)
            printf("read lock already set by %d\n",lock.l_pid);
        /*该文件已有读取锁*/
        else if(lock.l_type == F_WRLCK)
            printf("write lock already set by %d\n",lock.l_pid);
    }
}

void lock_get(int fd)
{
    // 设置flock结构体
    struct flock lock;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;
    lock.l_type = F_RDLCK;

    // 判断文件是否上锁
    if (fcntl(fd, F_GETLK, &lock) < 0)
    {
        printf("get lock failure by %d \n", getpid());
    }

    // 判断文件不能上锁的原因
    if (lock.l_type == F_UNLCK)
    {
        printf("no lock by %d\n", lock.l_pid);
    }
    // 该文件已有写入锁
    else if (lock.l_type == F_RDLCK)
    {
        printf("read lock already set by %d", lock.l_pid);
    }
    // 该文件已有读取锁
    else if (lock.l_type == F_WRLCK)
    {
        printf("write lock already set by %d", lock.l_pid);
    }
}


int main(int argc, char *argv[])
{
    // 打开文件
    int fd;
    fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
    if (fd == -1)
    {
        perror("Error open func.\n");
        exit(EXIT_FAILURE);
    }

    // 选择功能
    int type;
    switch (argv[2][0])
    {
        case 'w':       // 写锁
            type = F_WRLCK;
            break;
        case 'r':       // 读锁
            type = F_RDLCK;
            break;
        case 'u':       // 解锁
            type = F_UNLCK;
            break;
        case 'g':       // 获取锁状态
            type = 0;
            break;
        default:
            break;
    }
    if (type == 0)
    {
        lock_get(fd);
    }
    else
    {
        lock_set(fd, type);
    }
    
    // 关闭文件
    close(fd);
    exit(EXIT_SUCCESS);
}

posted @ 2022-04-30 20:07  starc的miao  阅读(38)  评论(0)    收藏  举报