标签:进程间通信之共享内存
共享内存:
用于进程之间的数据传递,是system v版本中最高效的,但是它不会同步与互斥,所以常与信号量搭配使用。
nattch:表示有多少个进程挂接在共享内存上。要查看其值用 ipcs -m 命令
删除key值用 ipcrm -m +key值;
图形理解共享内存:
#include <sys/types.h>
#include <sys/shm.h>
1.创建共享内存函数:
int shget(key_t key,size_t size, int shmflg* buf);
第二个参数是其大小,一般为4k 即4096的整数倍;
第三个参数一般为:IPC_CREAT|IPC_EXCL;
2.销毁共享内存的函数:
int shmctl(int shm _id,int cmd,int shmflg* buf);
第二个参数一般为:IPC_RMID;
3.挂接在共享内存上:
void *shmat(int shmid, const void *shmaddr, int shmflg);
4.去关联共享内存
int shmdt(const void *shmaddr);
共享内存实现代码:
//comm.h
1 #include<stdio.h>
2 #include<sys/ipc.h>
3 #include<sys/shm.h>
4 #include<stdlib.h>
5 #include<unistd.h>
6 #define _PATH_ "."
7 #define _PROJ_ID_ 0X7777
8 #define _SIZE_ 4096
9 int shm_create()
10 {
11 key_t key=ftok(_PATH_, _PROJ_ID_);
12 if(key<0)
13 {
14 perror("ftok");
15 return -1;
16 }
17 int shm_id=shmget(key,_SIZE_,IPC_CREAT|IPC_EXCL|0666);
18 if(shm_id<0)
19 {
20 perror("shmget");
21 return -1;
22 }
23 return shm_id;
24 }
25
26 int shm_get()
27 {
28
29
30 key_t key=ftok(_PATH_, _PROJ_ID_);
31 if(key<0)
32 {
33 perror("ftok");
34 return -1;
35 }
36 int shm_id=shmget(key,_SIZE_,IPC_CREAT);//得到的是已创建好的
37 if(shm_id<0)
38 {
39 perror("shmget");
40 return -1;
41 }
42 return shm_id;
43
44 }
//server.c
1 #include"comm.h"
2
3 int main()
4 {
5 int shm_id=shm_create();
6 sleep(10);
7 char *start=at_shm(shm_id);
8 int i;
9 for(i=0;i<20;++i)
10 {
11
12 printf("%s\n",start);
13 sleep(1);
14
15 }
16 dt_shm(start);
17 shm_destroy(shm_id);
18 return 0;
19 }
//client.c
1 #include"comm.h"
2
3 int main()
4 {
5 int shm_id=shm_get();
6 sleep(5);
7 char *start=at_shm(shm_id);
8 int i;
9 for(i=0;i<20;++i)
10 {
11 start[i]=‘A‘;
12 start[i+1]=‘\0‘;
13 }
14 sleep(7);
15 dt_shm(start);
16 sleep(12);
17 return 0;
18
19
20
21
22 }
//Makefile
1 .PHONY:all
2 all:server client
3 server:server.c
4 gcc -o $@ $^
5 client:client.c
6 gcc -o $@ $^
7 .PHONY:clean
8 clean:
9 rm -f server client:
结果分析:
当server.c 运行起来时显示器上没有东西,当client.c运行起来打印东西时,这时的server也可以读到内容将其显示在显示器上。这样实现了不同进程之间的通信,通过共享内存。
本文出自 “输出菱形图案” 博客,请务必保留此出处http://10541571.blog.51cto.com/10531571/1764736
标签:进程间通信之共享内存
原文地址:http://10541571.blog.51cto.com/10531571/1764736