unix 共享储存及信号量例程

发布时间:2020-07-16 18:42:29 作者:xieyihua
来源:网络 阅读:423

  1. 例程说明:

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

 

附件:http://down.51cto.com/data/2362216
推荐阅读:
  1. 关于mount在unix系统上
  2. unix XSI IPC-信号量同步例程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

共享储存 信号量 un ni

上一篇:thinkphp-volist2

下一篇:单主机部署LAMP

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》