进程锁 读写文件的小例子 C++代码
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                进程锁 读写文件的小例子 C++代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                代碼
#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>/*** 返回一片共享內(nèi)存標(biāo)識符,用于后續(xù)獲取該共享內(nèi)存,以及銷毀該共享內(nèi)存*/class mutex_function{public:mutex_function() = default;// 定義進(jìn)程鎖結(jié)構(gòu)體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;}}// 初始化進(jìn)程鎖結(jié)構(gòu)體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;}// 在共享內(nèi)存上定義進(jìn)程鎖結(jié)構(gòu)體并且返回其位置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;}// 銷毀進(jìn)程鎖結(jié)構(gòu)體,利用其memory_addr變量索引到其占用的共享內(nèi)存并銷毀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";// 創(chuàng)建自定義進(jì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; }?
總結(jié)
以上是生活随笔為你收集整理的进程锁 读写文件的小例子 C++代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 使用引用的方式交换数据的数值
- 下一篇: 公积金联名卡办理银行有区别吗?根据自己的
