首页 > 系统相关 >Linux读写者管理sharefile文件,多个客户端向服务器输送信息,由服务器为中转站将信息存入sharefile文件中(内含Makefile文件)

Linux读写者管理sharefile文件,多个客户端向服务器输送信息,由服务器为中转站将信息存入sharefile文件中(内含Makefile文件)

时间:2024-09-23 20:48:17浏览次数:12  
标签:文件 lock sharefile 服务器 shared sem include data shm

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

相关文章

  • 超链接相关属性:跳转页面、跳转文件、跳转锚点、换成指定应用
    1.跳转页面我这里用绝对网络路径跳转百度、京东说一下img属性值target的含义,值_self是在当前页签跳转,相对的值_blank就是打开新标签跳转注意事项:点击前的超链接字体为蓝色,点击时为红色,点击后的超链接字体为紫色(只限第一次跳转,第一次以后点击前的超链接字体也为紫色,除非刷新......
  • 一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
    前言最近有不少小伙伴在问:.NET有什么值得推荐的网络通信框架?今天大姚给大家分享一个.NET开源、免费(MITLicense)、快速、低延迟的异步套接字服务器和客户端库:NetCoreServer。项目介绍NetCoreServer是一个.NET开源、免费(MITLicense)、快速、低延迟的异步套接字服务器和客户端库。它支......
  • 最好的文件管理器-dolphin
    WARN:windows没有,废话少说,直接开始what'sdolphin长得好看dolphin使用kde的主题管理,可以通过kde的主题商店配合kvantummanager配制出一个好看的主题,类似于我上面的(配置mac模式的是最简单的,相信苹果的设计师)分屏当然,还有很多其他的文件管理器可以分屏,但是dolphin可......
  • 用Asio实现同步echo服务器
    使用Asio实现同步echo服务器服务端sync_server.h#ifndefASYNC_SERVER_H#define ASYNC_SERVER_H#include<boost/asio/ip/tcp.hpp>#include<memory>#include<set>#include<thread>namespaceMS{ typedefstd::shared_ptr<boost::asio::ip::......
  • 【Python调用ddddocr打包成exe文件指定模型库及注意事项】
    ddddocr打包成exe后一直存在各种各样的问题,例如:ddddocr\common.onnxfailed.Filedoesn’texist查阅资料后,问题得到解决。但相关资料不多,且不够详细,特写下本文,以便于后来者解决问题。希望本文能帮到你。目标:为了方便调用,打算分别起三个服务,并且打包成EXE方便......
  • Python 如何读取和写入文件
    Python如何读取和写入文件文件操作是编程中常见的任务,几乎所有编程语言都支持文件的读写功能。在Python中,文件操作简单直观,适用于从初学者到经验丰富的开发者。无论是处理小型文本文件,还是需要处理大型数据文件,Python提供了丰富的工具和方法来完成这些任务。本文将带......
  • struts2配置文件中的method={1}详解
    转载:fifiyong  https://www.cnblogs.com/fifiyong/p/6027565.htmlstruts.xml中的配置:<!--配置用户模块的action--><actionname="user_*"class="userAction"method="{1}"><resultname="registPage">/W......
  • 在云渲染中3D工程文件安全性怎么样?
    在云渲染中,3D工程文件的安全性是用户最关心的问题之一。随着企业对数据保护意识的增强,云渲染平台采取了严格的安全措施和加密技术,以确保用户数据的安全性和隐私性。云渲染平台为了保障用户数据的安全,采取了多层次的安全措施。首先,数据加密是基础,通过SSL/TLS等安全协议确保文件在......
  • 《模拟火车世界5》游戏启动时崩溃弹窗“找不到msvbvm60.dll”文件该怎么修复?模拟火车
    在启动《模拟火车世界5》时,若遭遇崩溃并弹窗提示“找不到msvbvm60.dll”文件,可以从可靠渠道下载该文件,放置到系统指定目录。也可尝试重新安装游戏或使用系统修复工具来解决此问题。本篇将为大家带来《模拟火车世界5》游戏启动时崩溃弹窗“找不到msvbvm60.dll”文件该怎么修复的......
  • 《勇敢小骑士》游戏闪退弹窗提示“找不到kernel.dll”文件该怎么解决?游戏启动时崩溃提
    当玩《勇敢小骑士》游戏出现闪退并弹窗提示“找不到kernel.dll”文件时,可以在网上搜索可靠的该文件资源进行下载,然后放置到合适的系统目录中。也可尝试检查游戏完整性,看能否自动修复此问题。本篇将为大家带来《勇敢小骑士》游戏闪退弹窗提示“找不到kernel.dll”文件该怎么解决......