中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unix 共享儲存及信號量例程

發布時間:2020-07-16 18:42:29 來源:網絡 閱讀:423 作者:xieyihua 欄目:系統運維

  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
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同德县| 阿坝县| 襄城县| 临城县| 南康市| 泰和县| 蒙城县| 海兴县| 盖州市| 崇信县| 隆回县| 抚松县| 沾益县| 太白县| 辽中县| 谷城县| 遵义县| 巩留县| 邢台县| 高碑店市| 钟祥市| 钟山县| 宕昌县| 尉犁县| 承德县| 舟曲县| 东兰县| 阿巴嘎旗| 车致| 元谋县| 岱山县| 肃南| 游戏| 瓮安县| 永嘉县| 城固县| 金湖县| 思茅市| 涿鹿县| 聊城市| 垫江县|