首页 / C++ / 进程锁 读写文件的小例子 C++代码
进程锁 读写文件的小例子 C++代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了进程锁 读写文件的小例子 C++代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3961字,纯文字阅读大概需要6分钟。
内容图文
代码
#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>
/**
* 返回一片共享内存标识符,用于后续获取该共享内存,以及销毁该共享内存
*/
namespace hsm{
namespace hal{
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;
};
}//namespace hal
}//namespace hsm
//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++代码全部内容,希望文章能够帮你解决进程锁 读写文件的小例子 C++代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。