Linux下创建共享内存和测试
2014-12-17 10:33
232 查看
/* This is shdata.h Founded In Others's Blog. Thanks For Sharing Your Knowledge */ #ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { int written;//作为一个标志,非0:表示可读,0表示可写 char text[TEXT_SZ];//记录写入和读取的文本 }; #endif
/
/* This is shm_read.c . For read sharing-memory Founded In Others's Blog. Thanks For Sharing Your Knowledge */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include "shdata.h" int main() { 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); } //将共享内存连接到当前进程的地址空间 shm = shmat(shmid, 0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("\nMemory attached at %X\n", (int)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,退出循环(程序) if(strncmp(shared->text, "end", 3) == 0) running = 0; } else//有其他进程在写数据,不能读取数据 sleep(1); } //把共享内存从当前进程中分离 if(shmdt(shm) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } //删除共享内存 if(shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
/* This is shm_write.c Founded In Others's Blog. Thanks For Sharing Your Knowledge */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include "shdata.h" int main() { 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 %X\n", (int)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); 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应用程序开发(第2版),创建和使用库章节中共享库的测试(摘录)
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2
- Linux测试环境搭建好了,却申请不到共享内存。
- Linux 共享内存的创建,控制,脱离和删除
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试1
- Linux下共享内存及线程的创建
- Linux下的共享内存(02)---创建共享内存
- 【Linux】进程间通信(IPC)之共享内存详解与测试用例
- Linux环境进程间通信 共享内存
- Linux环境进程间通信(五): 共享内存
- linux下的简单共享内存map实现
- Linux环境进程间通信(五): 共享内存(上)
- linux 文件操作函数 通过例子来解释 父子间文件描述符共享 内存映像图
- linux 共享内存映射原理1 vmalloc kmalloc getfreepage
- Linux环境进程间通信: 共享内存
- Linux环境进程间通信(五): 共享内存(下)
- Linux的共享内存
- Linux环境进程间通信(五): 共享内存(上)
- linux 下创建共享库.so
- Linux的共享内存技术