Linux系统读写者将文件存入sharefile文件中,同时由多个客户端向服务器输入通信信息,并由服务器为中转站,将信息传入sharefile文件中(由于读写者存入sharefile文件的路径问题,sharefile文件要放入Linux虚拟机的“公共”文件中,不然不能运行,同时要将文件分开每个Makefile文件都要放在对应文件夹中)。
read-write模块(含主函数):
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <semaphore.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#define BUFFSIZE 100
#define SHM_NAME "/my_shared_memory" //把共享内存名字先设置为my_shared_memory
typedef struct {
sem_t r_w_lock;
sem_t w_lock;
sem_t r_w_z_lock;
int readerCount;
int writerCount;
} shared_data_t;//设置信号量结构体,存入共享内存中,方便各个进程访问
void Reader1(shared_data_t* shared_data);//声明读者类进程
void Writer1(shared_data_t* shared_data);//声明写者类进程
void read_action(void);//声明读者动作
void writer_action(void);//声明写者动作
int main(int argc, char* argv[])
{
int shm_fd;
shared_data_t* shared_data;//定义共享信号量结构,定义指针类型的访问索引
// 创建共享内存
shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
perror("shm_open");
exit(1);
}
// 设置共享内存大小
if (ftruncate(shm_fd, sizeof(shared_data_t)) == -1) {
perror("ftruncate");
exit(1);
}
// 映射共享内存,将假设中的共享内存的地址映射到真实地址中去
shared_data = (shared_data_t*)mmap(NULL, sizeof(shared_data_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shared_data == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 初始化信号量
sem_init(&shared_data->w_lock, 1, 1);
sem_init(&shared_data->r_w_lock, 1, 1);
sem_init(&shared_data->r_w_z_lock, 1, 1);
shared_data->readerCount = 0;
shared_data->writerCount = 0;
int k = 0;
while (1)
{
pid_t pid = fork();//生成两个进程,父进程为写类,子进程为读类
if (pid < 0)
{
perror("fork error\n");
exit(-1);
}
else if (pid > 0)
{
sem_wait(&shared_data->r_w_z_lock);//P操作
printf("parent process\n");//说明是父进程
printf("get write right!\n");//说明获取了写权限
Writer1(shared_data);//使用写者类,传入信号量
sem_post(&shared_data->r_w_z_lock);//V操作
}
else if (pid == 0)
{
sem_wait(&shared_data->r_w_z_lock);//P操作
printf("child process\n");//说明改进程为子进程
printf("get read right!\n");//说明获取读权限
Reader1(shared_data);//使用写者类,传入信号量
sem_post(&shared_data->r_w_z_lock);//V操作
}
k++;
if (k > 3)//用于结束进程3*4=12,可读写12次
break;
}
// 销毁信号量
sem_destroy(&shared_data->w_lock);//销毁信号量
//sem_destroy(&shared_data->r_w_lock);
sem_destroy(&shared_data->r_w_z_lock);//销毁读写总的信号量
// 解除共享内存映射,释放空间
if (munmap(shared_data, sizeof(shared_data_t)) == -1) {
perror("munmap");
exit(1);
}
// 删除共享内存
if (shm_unlink(SHM_NAME) == -1) {
perror("shm_unlink");
exit(1);
}
return 0;
}
标签:文件,lock,sharefile,服务器,shared,sem,include,data,shm From: https://blog.csdn.net/2201_75617301/article/details/142468198