C++ 使用有名信号量实现非亲缘进程间同步:共享文件访问示例
一个例子是多个进程需要访问一个共享资源,例如一个文件。这些进程可以使用有名信号量来同步对该文件的访问。
以下是一个简单的 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再次执行。这样,这两个进程就可以安全地访问共享文件。
原文地址: https://www.cveoy.top/t/topic/nD8b 著作权归作者所有。请勿转载和采集!