MST
星途 面试题库

面试题:C语言多进程编程中的资源竞争问题及解决

在Linux系统下使用C语言编写多进程程序时,常常会遇到资源竞争问题。假设你有多个进程同时访问和修改一个共享文件,如何通过编程手段避免数据不一致等资源竞争问题,请给出具体的实现思路和可能用到的函数。
33.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 文件锁机制:通过对共享文件加锁,同一时间只允许一个进程对文件进行访问或修改,确保数据一致性。
  2. 信号量:创建一个信号量来控制对共享文件的访问。信号量的值表示当前可以访问共享资源的进程数量,初始值通常设为1。当一个进程要访问共享文件时,先获取信号量(信号量值减1),访问完后释放信号量(信号量值加1)。

可能用到的函数

  1. 文件锁函数
    • fcntl:用于对文件描述符执行各种控制操作,可用于实现文件锁。例如:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    int fd = open("shared_file.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    struct flock lock;
    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");
        close(fd);
        exit(EXIT_FAILURE);
    }
    // 此时可以安全地对文件进行写操作
    // 完成操作后解锁
    lock.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &lock) == -1) {
        perror("fcntl unlock");
        close(fd);
        exit(EXIT_FAILURE);
    }
    close(fd);
    return 0;
}
  1. 信号量函数
    • sem_open:创建或打开一个信号量。
    • sem_wait:等待信号量,将信号量的值减1,如果信号量的值为0,则阻塞直到信号量的值大于0。
    • sem_post:释放信号量,将信号量的值加1。
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>

int main() {
    sem_t *sem = sem_open("/my_semaphore", O_CREAT, 0666, 1);
    if (sem == SEM_FAILED) {
        perror("sem_open");
        exit(EXIT_FAILURE);
    }

    if (sem_wait(sem) == -1) {
        perror("sem_wait");
        sem_close(sem);
        exit(EXIT_FAILURE);
    }
    // 可以安全地对共享文件进行操作
    // 完成操作后释放信号量
    if (sem_post(sem) == -1) {
        perror("sem_post");
        sem_close(sem);
        exit(EXIT_FAILURE);
    }
    sem_close(sem);
    return 0;
}