Linux进程通信——共享内存
2016-07-14 21:40
337 查看
生产者进程:
消费者进程:
/* * 进程间通信之信号量,代码源自《Linux程序设计》 */ #include <iostream> #include <string> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> // 使用信号量必须包含该文件 #include <sys/shm.h> using namespace std; // shmid_ds这个结构体已经在系统中定义了,所以不需要再次定义 struct shmid_ds; #define TEXT_SZ (2028) #define BUF_SIZE (1024) // 用户自定义的一个数据结构,同于进行共享 struct shared_use_st { int written; // 数据是否已经被写入的标志(等于1表示数据已经被写入,等于0表示没有被写) char text[TEXT_SZ]; }; // 生产者进程 int producer() { int running = 1; // 共享内存的地址 void* shm = 0; struct shared_use_st* shared; // 输入缓冲区 char buffer[BUF_SIZE + 1] = {0}; // 共享内存对象的id int shm_id; // 创建或者打开共享内存 shm_id = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT); if(shm_id == -1) { return -1; } // 把共享内存连接到当前进程的地址空间中 shm = shmat(shm_id,0,0); if((void*)-1 == shm) { return -1; } // 使用共享内存,即把共享内存当成一块用户自定义的数据,可以直接进行读写 shared = (struct shared_use_st*)shm; while (running) { // 消费者还没有读取完数据,需要等待 while (shared->written == 1) { sleep(1); } // 用户输入一些数据 cout << "Please input something:"; fgets(buffer,BUF_SIZE,stdin); // 写到共享内存中 strcpy(shared->text,buffer); shared->written = 1; // 如果用户写入的是end,那么表示退出 if(strcmp(buffer,"end") == 0) { running = 0; } } // 把共享内存从进程的地址空间中分离 if(shmdt(shm) == -1) { return -1; } sleep(2); return 0; } int main(int argc,char* argv[]) { return producer(); }
消费者进程:
/* * 进程间通信之信号量,代码源自《Linux程序设计》 */ #include <iostream> #include <string> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> // 使用信号量必须包含该文件 #include <sys/shm.h> using namespace std; // shmid_ds这个结构体已经在系统中定义了,所以不需要再次定义 struct shmid_ds; #define TEXT_SZ (2028) #define BUF_SIZE (1024) // 用户自定义的一个数据结构,同于进行共享 struct shared_use_st { int written; // 数据是否已经被写入的标志(等于1表示数据已经被写入,等于0表示没有被写) char text[TEXT_SZ]; }; // 消费者进程 int consumer() { // 循环标志 int running = 1; // 共享内存的地址 void* shm = NULL; // 用户的数据结构的指针 struct shared_use_st* shared; // 共享内存的id int shm_id; // 创建或者打开共享内存,创建的共享内存的大小是 sizeof(struct shared_use_st) shm_id = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT); if(-1 == shm_id) { return -1; } // 把共享内存连接到当前进程地址空间上 shm = shmat(shm_id,0,0); if((void*)-1 == shm) { return -1; } // 使用共享内存,把共享内存当作一块用户数据 shared = (struct shared_use_st*)shm; shared->written = 0; while (running) { // 如果数据已经被写入了,那么可以进行读取 if(shared->written > 0) { cout << shared->text << endl; sleep(1); // 重置写入标志 shared->written = 0; // 当被写入end的时候表示退出 if(0 == strcmp(shared->text,"end")) { running = 0; } } else { sleep(1); } } // 把共享内存从当前进程的地址空间中分离 if(shmdt(shm) ==1) { return -1; } // 删除共享内存 if(shmctl(shm_id,IPC_RMID,0) == -1) { return -1; } return 0; } int main(int argc,char* argv[]) { return consumer(); }
相关文章推荐
- 好用的 Linux 命令—alias
- linux文件比较命令
- Linux 高可用(HA)集群基本概念详解
- Linux 高可用(HA)集群基本概念详解
- 腾讯云主机Linux Centos7系统mysql server服务安装记录
- linux之多线程(1)
- Linux基础篇——线程
- linux awk命令详解
- Linux 下的格式化输出命令:print
- Linux IO实时监控iostat命令详解
- CentOs7下GitHub入门
- 在 Linux 下使用任务管理器
- CentOS7 默认防火墙firewalld替换为iptables
- linux下用命令筛选出路径下的目录名列表
- U-boot原厂版本移植流程
- Linux进程通信——信号量
- CentOS7 LNMP环境搭建
- CentOS7下安装部署LAMP环境
- 【Maven】安装及配置(Linux)
- ASP.NET Core MVC 在linux上的创建及发布