MST

星途 面试题库

面试题:C语言中Linux文件锁在多进程环境下的基础应用

在Linux环境下,使用C语言编写一个简单的多进程程序,其中父进程创建一个文件并写入一些数据,然后子进程尝试获取该文件的读锁并读取文件内容。请描述实现思路并给出关键代码片段。
10.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 创建文件并写入数据:父进程使用open函数打开或创建一个文件,然后使用write函数向文件中写入数据。
  2. 创建子进程:父进程调用fork函数创建子进程。
  3. 子进程获取读锁并读取文件:子进程使用fcntl函数获取文件的读锁,成功获取后使用read函数读取文件内容。

关键代码片段

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

#define FILE_NAME "test.txt"
#define DATA "Hello, World!\n"

int main() {
    int fd, pid;
    struct flock fl;

    // 打开或创建文件
    fd = open(FILE_NAME, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 写入数据
    if (write(fd, DATA, strlen(DATA)) == -1) {
        perror("write");
        close(fd);
        exit(EXIT_FAILURE);
    }
    close(fd);

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) { // 子进程
        char buffer[1024];
        ssize_t bytes_read;

        // 打开文件以读取
        fd = open(FILE_NAME, O_RDONLY);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }

        // 设置读锁
        fl.l_type = F_RDLCK;
        fl.l_whence = SEEK_SET;
        fl.l_start = 0;
        fl.l_len = 0;
        if (fcntl(fd, F_SETLKW, &fl) == -1) {
            perror("fcntl");
            close(fd);
            exit(EXIT_FAILURE);
        }

        // 读取文件内容
        bytes_read = read(fd, buffer, sizeof(buffer));
        if (bytes_read == -1) {
            perror("read");
        } else {
            buffer[bytes_read] = '\0';
            printf("Child process read: %s", buffer);
        }

        // 释放锁
        fl.l_type = F_UNLCK;
        if (fcntl(fd, F_SETLK, &fl) == -1) {
            perror("fcntl unlock");
        }
        close(fd);
    } else { // 父进程
        wait(NULL); // 等待子进程结束
    }

    return 0;
}