5.3 SYSV进程通信之共享内存

shm.c

 1 /*
 2  *共享内存:
 3    申请一块内存,进程A往共享内存中写,其他的进程就可以通过读出共享内存中的内容来获取进程A所传送的信息;
 4  * */
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <string.h>
 8 #include <error.h>
 9 #include <errno.h>
10 #include <sys/types.h>
11 #include <sys/ipc.h>
12 #include <sys/shm.h>
13 
14 #define error_exit(_errmsg_) error(EXIT_FAILURE,errno,_errmsg_)
15 
16 int main()
17 {
18     /*根据一个pathname和project_id 产生一个SYSV IPC 对象的键值
19      * key_t ftok(const char *pathname, int proj_id);
20      * 参数:
21      *成功返回键值,失败返回-1
22      * */
23     key_t key;
24     if(-1 == (key = ftok(".",'a'))) /*1.ftok产生键值*/
25         printf("key = %#x\n",key);
26     /*
27      *int shmget(key_t key, size_t size, int shmflg);
28      参数:
29         size:共享内存的大小
30         shmflg: IPC_CREAT     
31                 IPC_EXCL
32     成功返回共享内存的ID号;失败返回-1.
33      * */
34 
35     int shmid = 0;
36     if(-1 == (shmid = shmget(key,4096,IPC_CREAT | 0644)))/*2.创建共享内存*/
37         error_exit("fail to shmget!");
38     /*映射一个进程空间到共享内存中
39       void *shmat(int shmid, const void *shmaddr, int shmflg);
40       参数:
41         shmid:共享内存的ID号
42         shmaddr:
43             NULL:            系统自动选取一个随机的地址空间映射到共享内存中
44             非NULL&SHM_RND: 系统自动选取一个距离传入地址最近的能够映射到共享内存的空间去映射
45         shmflg:0阻塞  
46         成功返回映射到共享内存中的空间地址,失败返回-1.
47 
48         接触映射
49         int shmdt(const void *shmaddr);
50         参数:
51             shmaddr:映射空间的首地址 
52             成功返回0;失败返回-1
53      * */
54     char *shmaddr = NULL;
55     if((void*)-1 == (shmaddr = (void*)shmat(shmid,NULL,0)))/*3.建立映射*/
56         error_exit("fail to shmat!");
57 
58     strcpy(shmaddr,"hello world!hhh...");/*4.使用*/
59     printf("shmaddr = %s\n",shmaddr);
60     printf("*shmaddr = %c\n",*shmaddr);
61 
62     getchar();
63     if(-1 == shmdt(shmaddr)) /*5.结束/解除映射*/
64         error_exit("fail to shmdt!");
65 
66     /*向共享内存shmid 发送一个命令
67      *int shmctl(int shmid, int cmd, struct shmid_ds *buf);
68      参数:
69         cmd:IPC_STAT
70         IPC_SET
71         IPC_RMID
72     成功返回0;失败返回-1
73 
74      * */
75     getchar();
76     if(-1 == shmctl(shmid,IPC_RMID,NULL))/*6.删除共享内存*/
77         error_exit("fail to shmctl!");
78     return 0;
79 }

 

posted @ 2017-03-14 21:35  bkycrmn  阅读(223)  评论(0)    收藏  举报