MST

星途 面试题库

面试题:C语言中Linux文件描述符跨进程使用的同步问题

当多个进程通过文件描述符对同一文件进行读写操作时,可能会出现竞争条件。在C语言的Linux编程环境中,如何利用文件锁机制(如fcntl函数实现的文件锁)来保证跨进程文件操作的同步性?请详细阐述实现思路并给出示例代码。
12.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 获取文件描述符:通过 open 函数打开要操作的文件,得到文件描述符 fd
  2. 定义锁结构:使用 struct flock 结构体来设置锁的类型(读锁、写锁等)、作用范围等信息。
  3. 设置锁操作:通过 fcntl 函数的 F_SETLKF_SETLKW 命令来设置文件锁。F_SETLK 是非阻塞的,如果锁不能立即获取则返回 -1;F_SETLKW 是阻塞的,会等待直到锁可以获取。
  4. 文件操作:在获取到锁后,进行文件的读写操作。
  5. 释放锁:使用 fcntl 函数的 F_SETLK 命令,并将锁类型设置为 F_UNLCK 来释放文件锁。

示例代码

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

int main() {
    int fd;
    struct flock lock;

    // 打开文件
    fd = open("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 设置写锁
    lock.l_type = F_WRLCK;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0; // 整个文件

    // 尝试获取写锁,阻塞方式
    if (fcntl(fd, F_SETLKW, &lock) == -1) {
        perror("fcntl F_SETLKW");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 获取到锁后进行文件写操作
    const char *message = "Hello, file locking!";
    if (write(fd, message, strlen(message)) == -1) {
        perror("write");
    }

    // 释放写锁
    lock.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &lock) == -1) {
        perror("fcntl F_SETLK");
    }

    close(fd);
    return 0;
}

在上述代码中:

  1. 首先通过 open 函数打开文件 test.txt,如果文件不存在则创建。
  2. 然后设置 struct flock 结构体 lock,指定要获取写锁。
  3. 使用 fcntl 函数以阻塞方式获取写锁。
  4. 获取到锁后进行文件写操作。
  5. 最后释放写锁并关闭文件。

如果是读锁操作,只需将 lock.l_type 设置为 F_RDLCK 即可。读锁允许多个进程同时读取文件,但会阻止写操作,直到所有读锁被释放。写锁则会阻止其他进程的读和写操作。