进程间通讯--共享内存
2018-02-06 20:12
369 查看
read.c
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { //作为一个标志,非0:表示可读,0表示可写 int written; //记录写入和读取的文本 char text[TEXT_SZ]; }; #endif int main(void) { int running = 1;//程序是否继续运行的标志 void *shm = NULL;//分配的共享内存的原始首地址 struct shared_use_st *shared;//指向shm int shmid;//共享内存标识符 //创建共享内存 shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } //将共享内存连接到当前进程的地址空间 /*********** shmat : 把共享内存区对象映射到调用进程的地址空间 void *shmat(int shmid, const void *shmaddr, int shmflg) shmid : 共享内存标识符 shmaddr : 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置 *************/ shm = shmat(shmid, 0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("\nMemory attached at %p\n", shm); //设置共享内存 shared = (struct shared_use_st*)shm; shared->written = 0; while(running)//读取共享内存中的数据 { //没有进程向共享内存定数据有数据可读取 if(shared->written != 0) { printf("You wrote: %s", shared->text); sleep(rand() % 3); //读取完数据,设置written使共享内存段可写 shared->written = 0; //输入了end,退出循环(程序) /*********** int strncmp ( const char * str1, const char * str2, size_t n ); 【参数】str1, str2 为需要比较的两个字符串,n为要比较的字符的数目 【返回值】若str1与str2的前n个字符相同,则返回0; 若s1大于s2,则返回大于0的值; 若s1 若小于s2,则返回小于0的值 ***************/ if(strncmp(shared->text, "end", 3) == 0) running = 0; } else//有其他进程在写数据,不能读取数据 sleep(1); } //把共享内存从当前进程中分离 /*********** 该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它, 只是使该共享内存对当前进程不再可用。它的原型如下: int shmdt(const void *shmaddr); 参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1 **************/ if(shmdt(shm) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } //删除共享内存 /********** shmctl : (共享内存管理):完成对共享内存的控制 IPC_RMID :删除这片共享内存 **************/ if(shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } /************ //创建共享内存 //将共享内存连接到当前进程的地址空间 //设置共享内存 //读取共享内存中的数据 //把共享内存从当前进程中分离 //删除共享内存 **************/write.c
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include "shmdata.h" #ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { //作为一个标志,非0:表示可读,0表示可写 int written; //记录写入和读取的文本 char text[TEXT_SZ]; }; #endif int main(void) { int running = 1; void *shm = NULL; struct shared_use_st *shared = NULL; char buffer[BUFSIZ + 1];//用于保存输入的文本 int shmid; //创建共享内存 shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } //将共享内存连接到当前进程的地址空间 shm = shmat(shmid, (void*)0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %p\n", shm); //设置共享内存 shared = (struct shared_use_st*)shm; while(running)//向共享内存中写数据 { //数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本 while(shared->written == 1) { sleep(1); printf("Waiting...\n"); } //向共享内存中写入数据 printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); /************ 函数原型char *strncpy(char *dest,char *src,size_t n); (c/c++)复制字符串src中的内容(字符,数字、汉字....)到字符串dest中, 复制多少由size_t n的值决定 ****************/ strncpy(shared->text, buffer, TEXT_SZ); //写完数据,设置written使共享内存段可读 shared->written = 1; //输入了end,退出循环(程序) if(strncmp(buffer, "end", 3) == 0) running = 0; } //把共享内存从当前进程中分离 if(shmdt(shm) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } sleep(2); exit(EXIT_SUCCESS); }
相关文章推荐
- Linux进程间通讯之共享内存
- Linux进程通讯之一:共享内存
- 进程间通讯——共享内存
- 进程间通讯——消息队列、信号量以及共享内存
- 多线程进程间通讯共享内存(Shared Memory with IPC with threads)
- 利用共享内存实现进程之间的通讯
- 进程间通讯——共享内存
- 进程间通讯共享内存的具体步骤
- 进程间通讯:共享内存
- C++:共享内存(进程间通讯)(转载)
- linux进程间通讯-共享内存
- WIN32 进程间通讯-共享内存
- linux进程通讯-共享内存1
- linux 进程间通讯-共享内存
- linux进程通讯-共享内存
- linux进程通讯-共享内存
- 进程间通讯----共享内存
- 进程通讯(五)--共享内存
- 进程间通讯之共享内存
- 进程间的通讯方式_共享内存