12.1 共享内存、信号量函数封装

   共享内存函数封装:

  1 #include <unistd.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <sys/mman.h>
  6 #include <sys/ipc.h>
  7 #include <sys/shm.h>
  8 #include <sys/sem.h>
  9 
 10 #include <stdlib.h>
 11 #include <stdio.h>
 12 #include <errno.h>
 13 #include <string.h>
 14 
 15 #include <sys/ipc.h>
 16 #include <sys/sem.h>
 17 #include "myipc_sem.h"
 18 
 19 
 20 union semun {
 21 int              val;    /* Value for SETVAL */
 22 struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
 23 unsigned short  *array;  /* Array for GETALL, SETALL */
 24 struct seminfo  *__buf;  /* Buffer for IPC_INFO
 25                            (Linux specific) */
 26 };
 27 
 28 //@返回值 0 正确 其他错误
 29 int sem_creat(int key, int *semid)
 30 {
 31     int     ret = 0;
 32     //int     tmpsemid = 0;
 33     
 34     if (semid == NULL)
 35     {
 36         ret = SEMERR_PARAM;
 37         printf("func sem_creat() err:%d\n", ret);
 38         return ret;
 39     }
 40     ret = semget(key, 1, 0666| IPC_CREAT | IPC_EXCL); 
 41     if (ret == -1)
 42     {
 43             ret = errno;
 44             //perror("semget");
 45             if (errno == EEXIST) 
 46             {
 47                 ret = SEMERR_EEXIST;
 48                 printf("func sem_creat() 检测到信号量集已经存在:%d\n", ret);
 49                 return ret;
 50             }
 51     }
 52     *semid = ret;
 53     
 54     ret = sem_setval(*semid, 1);
 55     if (ret != 0)
 56     {
 57         printf("func sem_setval() err:%d\n", ret);
 58         return ret;
 59     }
 60     ret = 0;
 61     return ret;
 62 }   
 63 
 64 int sem_open(int key, int *semid)
 65 {
 66     int ret = 0;
 67     
 68     if (semid == NULL)
 69     {
 70         ret = SEMERR_PARAM;
 71         printf("func sem_open() err:%d\n", ret);
 72         return ret;
 73     }
 74     
 75     ret = semget(key, 0, 0); 
 76     if (ret == -1)
 77     {
 78             ret = errno;
 79             printf("func sem_open() 失败:%d\n", ret);
 80             return ret;    
 81     }
 82     *semid = ret;
 83     ret = 0;
 84     return ret;
 85 }  
 86 
 87 int sem_setval(int semid, int val)
 88 {
 89     int ret = 0;
 90     union semun su;
 91     su.val = val;
 92     ret = semctl(semid, 0,  SETVAL, su);
 93     return ret;
 94 }
 95 
 96 /*
 97 int sem_getval(int semid, int *val)
 98 {
 99     int ret = 0;
100     int tmpval;
101     if (val == NULL)
102     {
103         ret = SEMERR_PARAM;
104         printf("func sem_getval() err:%d\n", ret);
105         return ret;
106     }
107     union semun su;
108     tmpval = su.val ;
109     ret = semctl(semid, 0, GETVAL, su);
110     *val = tmpval  ;
111     printf("val:%d\n", tmpval);
112     return ret;
113 }
114 */
115 int sem_getval(int semid, int *myval)
116 {
117     int ret = 0;
118     int val;
119     union semun su;
120     val = su.val ;
121     //信号量 计数值
122     ret = semctl(semid, 0, GETVAL, su);
123     //printf("val:%d\n", val);
124     
125     *myval = ret;
126     ret = 0;
127     return ret;
128 }
129 
130 //信号量p操作时候,需要传递好几个信息给linux内核
131 //所以linux内核定义了一个结构
132 //我要操作信号量集的下标 0
133 //我要执行什么操作 -1 +1
134 //我按照什么策略执行操作 0  UNDO NOWAITing
135 int sem_p(int semid)
136 {
137     struct sembuf buf = {0, -1, 0};
138     int ret = 0;
139     ret = semop(semid, &buf, 1);
140     return ret;
141 }
142 
143 int sem_v(int semid)
144 {
145     struct sembuf buf = {0, 1, 0};
146     int ret = 0;
147     ret = semop(semid, &buf, 1);
148     return ret;
149 }

  信号量函数封装:

 1 #define    _OS_LINUX_
 2 
 3 #if defined _OS_LINUX_
 4 #include <stdio.h>
 5 #include <errno.h>
 6 #include <unistd.h>
 7 #include <memory.h>
 8 #include <sys/ipc.h>
 9 #include <sys/shm.h>
10 #include <sys/sem.h>
11 #include <sys/msg.h>
12 #include "myipc_shm.h" 
13 
14 #endif
15 
16 int shmflag = 0;
17 int shmkey;
18 
19 /***********************************************************************
20   功能描述:    创建共享内存
21   参数说明:    shmname  [in]  是共享内存名,系统中唯一标志
22                 shmsize  [in]  是要创建的共享内存的大小;
23                 shmhdl   [out] 共享内存的句柄.
24   返回值:      返回0函数执行成功;非0返回错误码
25 ************************************************************************/
26 int IPC_CreatShm(char *shmseedfile, int shmsize, int *shmhdl)
27 {
28     if(shmflag == 0)            //判断接口中共享内存key是否已经存在
29     {
30         shmkey = ftok(shmseedfile, 'c');
31         if (shmkey == -1)
32         {
33             perror("ftok");
34             return -1;
35         }
36             
37         shmflag = 1;
38     }
39     
40     //创建共享内存
41     *shmhdl = shmget(shmkey,shmsize,IPC_CREAT|0666);
42     if (*shmhdl == -1)            //创建失败
43         return -2;
44     return 0;
45 
46 }
47 /***********************************************************************
48   功能描述:    关联共享内存
49   参数说明:    shmhdl    [in]  共享的句柄
50                 mapaddr [out] 共享内存首地址
51   返回值:      返回0函数执行成功;非0返回错误码
52 ************************************************************************/
53 int
54 IPC_MapShm(int  shmhdl, void  **mapaddr)
55 {
56     void *tempptr = NULL;
57 
58     //连接共享内存
59     tempptr = (void *)shmat(shmhdl,0,SHM_RND);
60     if ((int)tempptr == -1)        //共享内存连接失败
61         return -1;
62     *mapaddr = tempptr;            //导出共享内存首指针
63 
64     return 0;
65 }
66 /***********************************************************************
67   功能描述:    取消共享内存关联
68   参数说明:    unmapaddr   [in] 共享内存首地址
69   返回值:      返回0函数执行成功;非0返回错误码
70 ************************************************************************/
71 int IPC_UnMapShm(void *unmapaddr)
72 {
73     int  rv;
74     //取消连接共享内存 
75     rv = shmdt((char *)unmapaddr);
76     if (rv == -1)            //取消连接失败
77         return -1;
78 
79     return 0;
80 }
81 /***********************************************************************
82   功能描述:    删除共享内存
83   参数说明:    shmhdl    [in]  共享的句柄
84   返回值:      返回0函数执行成功;非0返回错误码
85 ************************************************************************/
86 int IPC_DelShm(int shmhdl)
87 {
88     int  rv;
89     //删除共享内存
90     rv = shmctl(shmhdl,IPC_RMID,NULL);
91     if(rv < 0)                //删除共享内存失败
92         return -1;
93     return 0;
94 }

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9446158.html
今日推荐