代码

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cassert>
#include <pthread.h>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <cstring>
#include <sys/wait.h>/***  返回一片共享内存标识符,用于后续获取该共享内存,以及销毁该共享内存*/class mutex_function{public:mutex_function() = default;// 定义进程锁结构体typedef struct mutex_struct{pthread_rwlock_t lock;pthread_rwlockattr_t lock_attr;int memory_addr;}mutex_struct_t;int create_share_memory_id(const int index_of_key,size_t md5){const char* file_path = "./";key_t id = ftok(file_path,md5);const int share_memory_id = shmget(id,md5,IPC_CREAT | 0666);if (share_memory_id == -1){std::cout << "share_memory_id error!\n" << std::endl;exit(EXIT_FAILURE);}else{return share_memory_id;}}// 初始化进程锁结构体int init_mutex_struct(mutex_struct_t* mutex_ptr){pthread_rwlockattr_init(&(mutex_ptr->lock_attr));pthread_rwlockattr_setpshared(&(mutex_ptr->lock_attr),PTHREAD_PROCESS_SHARED);pthread_rwlock_init(&(mutex_ptr->lock),&(mutex_ptr->lock_attr));return 0;}// 在共享内存上定义进程锁结构体并且返回其位置mutex_struct_t* mutex_struct_addr(const int index){int memory_id = create_share_memory_id(index,sizeof (mutex_struct_t));mutex_struct_t * share_ptr = (mutex_struct_t* )shmat(memory_id, 0, 0);if (share_ptr == (void *)-1){std::cout << "share_ptr error!\n" << std::endl;exit(EXIT_FAILURE);}share_ptr->memory_addr = memory_id;assert(init_mutex_struct(share_ptr)== 0);return share_ptr;}// 销毁进程锁结构体,利用其memory_addr变量索引到其占用的共享内存并销毁const int destroy_mutex_memory(mutex_struct_t * mutex_struct){pthread_rwlock_destroy(&(mutex_struct->lock));pthread_rwlockattr_destroy(&(mutex_struct->lock_attr));assert(shmctl(mutex_struct->memory_addr,IPC_RMID, nullptr) == 0);return 0;}public:mutex_struct_t* mutex_struct_ptr;};//read file
void read_file(const std::string file_name,int id){std::ifstream fp(file_name,std::ios::binary);std::stringstream ss;ss << fp.rdbuf();std::cout << "线程"<< id << "抢占了资源,输出:" << ss.str() << std::endl;sleep(3);std::cout << "线程"<< id << "释放了资源...\n" << std::endl;fp.close();
}
//write file
void write_file(const char *file_name,char *str,int id){FILE *fd = fopen(file_name,"a+");if (fd == nullptr){printf("fd is nullptr and open file fail\n");} else{std::cout <<"线程"<< id << "抢占了资源" << std::endl;fwrite(str,strlen(str),1,fd);char *next = "\0";fwrite(next,strlen(next),1,fd);sleep(5);std::cout << "线程"<< id << "释放了资源...\n" << std::endl;}fclose(fd);
}
int main(){std::string file_name = "/home/gsc/Projects/1.txt";char * str1 = "progress 1\n";char * str2 = "progress 2\n";// 创建自定义进程锁hsm::hal::mutex_function mutex_function_object;mutex_function_object.mutex_struct_ptr = mutex_function_object.mutex_struct_addr(111);pid_t c_pid = fork();if (c_pid == -1) {perror("fork");exit(EXIT_FAILURE);} else if (c_pid > 0) {std::cout << "Parent process " << getpid() << std::endl;
//            pthread_rwlock_rdlock(&(mutex_function_object.mutex_struct_ptr->lock));
//            read_file(file_name,getpid());
//            pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));pthread_rwlock_wrlock(&(mutex_function_object.mutex_struct_ptr->lock));write_file(file_name.c_str(),str1,getpid());pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));wait(nullptr);} else {std::cout << "Child process " << getpid() << std::endl;pthread_rwlock_rdlock(&(mutex_function_object.mutex_struct_ptr->lock));read_file(file_name,getpid());pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));//        pthread_rwlock_wrlock(&(mutex_function_object.mutex_struct_ptr->lock));
//        write_file(file_name.c_str(),str2,getpid());
//        pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));exit(EXIT_SUCCESS);}return 0;
}

进程锁 读写文件的小例子 C++代码相关推荐

  1. Python读写文件(附完整模块化代码)

    一.前言 Python读写文件的代码有许多形式,虽然十分简单,但是每次使用时都需要查找才能用上.所以鄙人用自己贫乏的Python功力编写了一个读写模块的模板,希望最大化方便有文件读写需求的朋友. 二. ...

  2. java遍历本地文件夹_JAVA遍历一个文件夹中的所有文件的小例子

    import java.io.File; import java.util.ArrayList; public class FileTest { private static ArrayList fi ...

  3. Java解释XML文件的小例子

    <?xml version="1.0" encoding="GBK"?> <addresslist><name>hemmin ...

  4. C++:通过多态实现接口并生成dll和lib文件的小例子

    1.接口声明头文件 首先声明一个形状基类,然后是三个派生类三角形.长方形和圆形. 基类中只有一个函数,getArea()输出面积 三个派生类分别对getArea()重载,分别有各自的构造函数 派生类的 ...

  5. Python一些小例子的代码

    文本操作,实现边输入边输出 #实现边输入边输出 需要去Windows 找到该记事本文件,修改其内容并保存才可以真正的做到 import os f_read = open(r"..\day6\ ...

  6. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子

    Android获取屏幕方向及键盘状态的小例子 复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (conf ...

  7. html5 websocket插件,html5实现的WebSocket一个小例子(附代码)

    本篇文章给大家带来的内容是关于html5实现的WebSocket一个小例子(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 客户端代码: var socket; if (&q ...

  8. Android sdcard读写文件(二)

    继续说sdcard读写文件的情况,这篇博客说的是在sdcard根目录中读写文件,着重的而是多种方式的读写文件.直接给出代码: FileService.java package com.llp.clas ...

  9. C语言获取左键鼠标点击的次数,c语言在控制台判定鼠标左键的小例子

    c语言在控制台判定鼠标左键的小例子 复制代码 代码如下: // temp1.cpp : Defines the entry point for the console application. // ...

最新文章

  1. SCCM 2012系列9 补丁分发上
  2. 如何判断ListView中的CheckItem项是否选中?并将所以选项从ListView控件中删除?
  3. 作者:陈威,电子科技大学互联网科学中心硕士生。
  4. valotitle 轻量级 同步机制
  5. C++的继承知识点重温
  6. Linux arm 下载程序,arm-linux—gcc如何下载安装
  7. css样式的百分比都相对于谁?
  8. Postman系列之发送不同HTTP类型请求
  9. 2000,XP中显示器和系统匹配的问题?
  10. PB系统连接原生数据库DB文件
  11. python牛顿迭代公式_牛顿迭代法Python实现
  12. win10系统VirtualBox虚拟机安装
  13. 介绍会议中控系统模块化构成及功能作用
  14. qtcreator编译qt程序是如何调用moc的,如何通过pro文件向moc传入参数
  15. EditText属性和一些小技巧
  16. Pycharm-community-2020.2.3 社区版安装教程
  17. Retrace AV推出新型涂料添加剂,可在30分钟内灭杀新冠病毒
  18. 房价预测(基于决策树算法)
  19. 总结一下自己常用的软件和网站
  20. bzoj3252攻略 贪心+dfs序+线段树

热门文章

  1. python中for和while可以有else_Python 中的for,if-else和while语句
  2. linux串口编程实例_Linux 网络编程——原始套接字实例:发送 UDP 数据包
  3. 【转】进阶 JavaScript 必知的 33 个点【进阶必备】
  4. nuget 包版本冲突解决 packages.config
  5. 34观察者模式(Observer Pattern)
  6. 云计算底层技术-虚拟网络设备(Bridge,VLAN)
  7. Struts1工作原理
  8. 数学学习过程中的感悟(一)
  9. 业务异常 java_谈谈RxJava处理业务异常的几种方式
  10. 【最小费用可行流模板】