1.基本概念
共享内存是IPC机制中的一 种. 顾名思义,它允许两个不 相关的进程访问同一段内存 这是传递数据的一种非常有效的方式。
2.函数学习
第10类 共享内存编程
read.c:
阅读(64) | 评论(0) | 转发(0) |
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
共享内存是IPC机制中的一 种. 顾名思义,它允许两个不 相关的进程访问同一段内存 这是传递数据的一种非常有效的方式。
![](/attachment/201610/20/29512885_14769685910v8S.png)
2.函数学习
第10类 共享内存编程
10.1 创建/获取共享内存
10.1.1 函数名
shmget
10.1.2 函数原形
int shmget(ket_t key, size_t size, int shmflg);
10.1.3 函数功能
分配一个共享内存段,并返回其描述符
10.1.4 所属头文件
<sys/ipc.h> <sys/shm.h>
10.1.5 返回值
成功:返回创建或获取的共享内存描述符 失败:-1
10.1.6 参数说明
key:共享内存的键值
size:共享的内存大小
shmflg:打开标志,如果使用了IPC_CREAT则会新创建一块共享内存。
10.1.7 范例代码
10.2 映射共享内存
10.2.1 函数名
shmat
10.2.2 函数原形
void *shmat(int shmid, const void *shmaddr, int shmflg);
10.2.3 函数功能
映射共享内存
10.2.4 所属头文件
<sys/types.h> <sys/shm.h>
10.2.5 返回值
成功:返回映射到进程空间之后的地址 失败:(void *)-1
10.2.6 参数说明
shmid:共享内存描述符
*shmaddr:接受的内存地址,如果为NULL自动选择映射地址
shmflg:共享内存标志位
10.3 分离共享内存
10.3.1 函数名
shmdt
10.3.2 函数原形
int shmdt(const void *shmaddr);
10.3.3 函数功能
断掉进程空间中与共享内存的联系
10.3.4 所属头文件
<sys/types.h> <sys/shm.h>
10.3.5 返回值
成功:返回0 失败:-1
10.2.6 参数说明
*shmaddr:需要分离的地址
10.4 控制共享内存
10.4.1 函数名
shmctl
10.4.2 函数原形
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
10.4.3 函数功能
控制共享内存
10.4.4 所属头文件
<sys/ipc.h> <sys/shm.h>
10.4.5 返回值
成功:根据不同的操作返回不同的值 失败:-1
10.4.6 参数说明
shmid:要控制的共享内存的id
cmd: 控制操作的命令,如:IPC_RMID(表示删除)
*buf:获取linux中描述共享内存的sdmid_ds结构,(0)
3.代码编写
write.c:
3.代码编写
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
-
- #define TEXT_SZ 2048
-
- struct shared_use_st
- {
- int written_by_you;
- char some_text[TEXT_SZ];
- };
-
- int main()
- {
- int running = 1;
- int shmid;
- struct shared_use_st *shared_stuff;
- char buffer[TEXT_SZ];
- /*创建共享内存*/
- shmid = shmget(1234 , sizeof(struct shared_use_st), IPC_CREAT);
- if(shmid == -1)
- {
- printf("creat share memory failed.\n");
- exit(EXIT_FAILURE);
- }
-
- /*映射共享内存*/
- shared_stuff = (struct shared_use_st *)shmat(shmid, NULL, 0);
-
- /*循环*/
- while(running)
- {
- while(shared_stuff->written_by_you == 1)
- {
- sleep(1);
- printf("wait read process!\n");
- }
- /*获取用户输入*/
- fgets(buffer, TEXT_SZ, stdin);
- /*把字符串放入共享内存*/
- strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
- shared_stuff->written_by_you = 1;
-
- if(strncmp(buffer, "end", 3) == 0)
- running = 0;
- }
- /*脱离共享内存*/
- shmdt((const void *)shared_stuff);
-
- return 1;
- }
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- #define TEXT_SZ 4096
-
- struct shared_use_st
- {
- int written_by_you;
- char some_text[TEXT_SZ];
- };
-
- int main()
- {
- int shmid;
- struct shared_use_st *share_stuff;
- int running = 1;
- /*创建共享内存*/
- shmid = shmget(1234, sizeof(struct shared_use_st), IPC_CREAT);
- if(shmid == -1)
- {
- printf("creat share memory failed.\n");
- exit(EXIT_FAILURE);
- }
-
- /*映射共享内存*/
- share_stuff = (struct share_use_st *)shmat(shmid, NULL, 0);
-
- /*循环*/
- while(running)
- {
- /*打印共享内存中的字符串*/
- if(share_stuff->written_by_you == 1)
- {
- printf("write process write %s \n", share_stuff->some_text);
- share_stuff->written_by_you = 0;
-
- if(strncmp(share_stuff->some_text, "end", 3) == 0)
- running = 0;
- }
- }
- /*脱离共享内存*/
- shmdt((const void *)share_stuff);
-
- /*删除共享内存*/
- shmctl(shmid, IPC_RMID, 0);
-
- return 1;
- }
给主人留下些什么吧!~~
评论热议