千家信息网

unix 共享储存及信号量例程

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,例程说明:执行server 两个client在server 储存 内容两个client 进行读取内容三个进行程使用信号量进行同步server.c----------------------------
千家信息网最后更新 2024年11月12日unix 共享储存及信号量例程

  1. 例程说明:

  2. 执行server 两个client
  3. 在server 储存 内容
  4. 两个client 进行读取内容
  5. 三个进行程使用信号量进行同步
  1. server.c
  2. -----------------------------------------------------
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <sys/sem.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include "sem_shm.h"
  12. int main(int argc,char** argv)
  13. {
  14. int ret;
  15. int semque_id;
  16. //打开一个信号集
  17. semque_id = open_semque();
  18. //初始化信号量
  19. set_sem(semque_id, 1);
  20. ret = semctl(semque_id, 0, GETVAL);
  21. printf("信号集中第一个信号量的值为:%d\n",ret);
  22. fputs("设置共享内存\n",stdout);
  23. //打开一个共享储存
  24. int id_shm = open_shm();
  25. int count = 3;
  26. while(count--)
  27. {
  28. ret = semctl(semque_id, 0, GETVAL);
  29. printf("信号集中第一个信号量的值为:%d\n",ret);
  30. v_sem(semque_id);
  31. fputs("执行V操作\n",stdout);
  32. ret = semctl(semque_id, 0, GETVAL);
  33. printf("信号集中第一个信号量的值为:%d\n",ret);
  34. fputs("输入发送内容\n",stdout);
  35. char buf[100];
  36. memset(buf,100,0);
  37. scanf("%s",buf);
  38. //获取共享储存第一个有效地址
  39. char * addr = (char *)shmat(id_shm, 0, 0);
  40. if((void*)addr == (void*)-1)
  41. {
  42. perror("shmat\n");
  43. exit(1);
  44. }
  45. memset(addr,100,0);
  46. strncpy(addr,buf,100);
  47. fputs("内容发送完成\n",stdout);
  48. printf("\n");
  49. fputs("执行P操作\n",stdout);
  50. p_sem(semque_id);
  51. sleep(1);
  52. }
  53. fputs("是否删除共享内存退出 y or n\n",stdout);
  54. if(getchar()=='y')
  55. {
  56. shmctl(id_shm, IPC_RMID, NULL);
  57. }
  58. return 0;
  59. }
  60. -----------------------------------------------------
  61. client.c
  62. -----------------------------------------------------
  63. #include <sys/types.h>
  64. #include <sys/ipc.h>
  65. #include <sys/sem.h>
  66. #include <stdlib.h>
  67. #include <sys/shm.h>
  68. #include <unistd.h>
  69. #include <stdio.h>
  70. #include <string.h>
  71. #include "sem_shm.h"
  72. int main(int argc,char** argv)
  73. {
  74. int ret;
  75. int semque_id = open_semque();
  76. int shm_id = open_shm();
  77. ret = semctl(semque_id, 0, GETVAL);
  78. printf("信号集中第一个信号量的值为:%d\n",ret);
  79. while(1)
  80. {
  81. fputs("执行操作V\n",stdout);
  82. v_sem(semque_id);
  83. ret = semctl(semque_id, 0, GETVAL);
  84. printf("信号集中第一个信号量的值为:%d\n",ret);
  85. fputs("读取服务器内容\n",stdout);
  86. char * addr = (char *)shmat(shm_id, 0, SHM_RDONLY);
  87. if((void*)addr == (void*)-1)
  88. {
  89. perror("shmat\n");
  90. exit(1);
  91. }
  92. fflush(stdout);
  93. fputs(addr,stdout);
  94. printf("\n");
  95. fputs("执行操作P\n",stdout);
  96. p_sem(semque_id);
  97. ret = semctl(semque_id, 0, GETVAL);
  98. printf("信号集中第一个信号量的值为:%d\n",ret);
  99. sleep(1);
  100. }
  101. //semctl(semque_id, 0, IPC_RMID);
  102. return 0;
  103. }
  104. -----------------------------------------------------
  105. sem_shm.c
  106. -----------------------------------------------------
  107. #include "sem_shm.h"
  108. #include <sys/types.h>
  109. #include <sys/ipc.h>
  110. #include <sys/sem.h>
  111. #include <stdlib.h>
  112. #include <sys/shm.h>
  113. #include <unistd.h>
  114. #include <stdio.h>
  115. #include <string.h>
  116. int open_semque(void)
  117. {
  118. key_t key = ftok("./",100);
  119. if(key == -1)
  120. {
  121. perror("ftok\n");
  122. exit(1);
  123. }
  124. int semque_id = semget(key, 1,IPC_CREAT|0666);
  125. if(semque_id == -1)
  126. {
  127. perror("msgget\n");
  128. exit(1);
  129. }
  130. return semque_id;
  131. }
  132. void set_sem(int semque_id, int val)
  133. {
  134. union semun sem_union;
  135. sem_union.val = val;
  136. if(semctl(semque_id, 0, SETVAL, sem_union) == -1)
  137. {
  138. perror("semctl_set\n");
  139. exit(1);
  140. }
  141. }
  142. int open_shm()
  143. {
  144. key_t key = ftok("../",100);
  145. if(key == -1)
  146. {
  147. perror("ftok\n");
  148. exit(1);
  149. }
  150. //0666表示user group other 三种用户都没有执行权限
  151. int id_shm = shmget(key, SHM_SIZE, IPC_CREAT|0666);
  152. if(-1 == id_shm)
  153. {
  154. perror("shmget\n");
  155. exit(1);
  156. }
  157. return id_shm;
  158. }
  159. void p_sem(int semque_id)
  160. {
  161. struct sembuf arry[1];
  162. arry[0].sem_num = 0;
  163. arry[0].sem_op = 1;
  164. //arry[0].sem_flg = SEM_UNDO;
  165. int ret = semop(semque_id, arry, 1);
  166. if(ret)
  167. {
  168. perror("semop\n");
  169. exit(1);
  170. }
  171. }
  172. void v_sem(int semque_id)
  173. {
  174. struct sembuf arry[1];
  175. arry[0].sem_num = 0;
  176. arry[0].sem_op = -1;
  177. //arry[0].sem_flg = IPC_NOWAIT;
  178. //arry[0].sem_flg = SEM_UNDO;
  179. int ret = semop(semque_id, arry, 1);
  180. if(ret)
  181. {
  182. perror("semop\n");
  183. exit(1);
  184. }
  185. }
  186. -----------------------------------------------------
  187. sem_shm.h
  188. -----------------------------------------------------
  189. #ifndef SEM_SHM_H
  190. #define SEM_SHM_H
  191. #include <sys/types.h>
  192. #include <sys/ipc.h>
  193. #include <sys/sem.h>
  194. #define SHM_SIZE 100
  195. int open_semque(void);
  196. void set_sem(int, int);
  197. void v_sem(int);
  198. void p_sem(int);
  199. int open_shm();
  200. union semun
  201. {
  202. int val;
  203. struct semid_ds buf;
  204. unsigned short *array;
  205. };
  206. #endif // end SEM_SHM_H
  207. -----------------------------------------------------
  208. makefile
  209. -----------------------------------------------------
  210. CC=gcc
  211. Target0=server
  212. Target1=client
  213. warn=-Wall
  214. ####################
  215. .PHONY: all clean # command: make all or make clean
  216. clean:
  217. rm -f $(obj) main server client *~ *gch *.o
  218. ###################
  219. all: $(Target0) $(Target1)
  220. $(Target0):server.o sem_shm.o
  221. $(CC) -o $@ $^ ${warn}
  222. server.o:server.c
  223. $(CC) -c $< ${warn}
  224. $(Target1):client.o sem_shm.o
  225. $(CC) -o $@ $^ ${warn}
  226. client.o:client.c
  227. $(CC) -c $< ${warn}
  228. sem_shm.o:sem_shm.c
  229. $(CC) -c $< ${warn}
附件:http://down.51cto.com/data/2362216
0