一个例子是多个进程需要访问一个共享资源,例如一个文件。这些进程可以使用有名信号量来同步对该文件的访问。

以下是一个简单的 C++ 程序,其中两个进程使用有名信号量来同步对文件的访问:

Process 1:

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>

int main() {
    // 创建一个有名信号量
    sem_t* sem = sem_open("/my_semaphore", O_CREAT, S_IRUSR | S_IWUSR, 1);
    if (sem == SEM_FAILED) {
        std::cerr << 'Failed to create semaphore!' << std::endl;
        return 1;
    }

    // 打开共享文件
    int fd = open('shared_file.txt', O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        std::cerr << 'Failed to open file!' << std::endl;
        return 1;
    }

    // 等待信号量
    sem_wait(sem);

    // 写入文件
    write(fd, 'Hello from process 1!\n', 22);

    // 释放信号量
    sem_post(sem);

    // 关闭文件和信号量
    close(fd);
    sem_close(sem);

    return 0;
}

Process 2:

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>

int main() {
    // 打开有名信号量
    sem_t* sem = sem_open("/my_semaphore", 0);
    if (sem == SEM_FAILED) {
        std::cerr << 'Failed to open semaphore!' << std::endl;
        return 1;
    }

    // 打开共享文件
    int fd = open('shared_file.txt', O_RDWR);
    if (fd == -1) {
        std::cerr << 'Failed to open file!' << std::endl;
        return 1;
    }

    // 等待信号量
    sem_wait(sem);

    // 读取文件
    char buffer[100];
    read(fd, buffer, 100);
    std::cout << buffer;

    // 释放信号量
    sem_post(sem);

    // 关闭文件和信号量
    close(fd);
    sem_close(sem);

    return 0;
}

这两个进程都打开了同一个文件,并使用有名信号量来保证只有一个进程在任何时候访问该文件。在这个例子中,进程1首先等待信号量,然后写入文件。一旦它写完了,它释放了信号量,让进程2执行。进程2等待信号量,然后读取文件。一旦它读取完了,它也释放了信号量,让进程1再次执行。这样,这两个进程就可以安全地访问共享文件。

C++ 使用有名信号量实现非亲缘进程间同步:共享文件访问示例

原文地址: https://www.cveoy.top/t/topic/nD8b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录