信号量结合共享内存训练

打印 上一主题 下一主题

主题 1962|帖子 1962|积分 5886

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设计程序,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量举行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。进程B对变量举行+1操作,写入共享内存,进程C读取共享内存的数据,并输出。
  1. /********************************************************************************
  2. *
  3. *
  4. * 使用信号量对共享内存进行互斥访问
  5. * author:jindouliu2024@163.com
  6. * date:2025.5.8
  7. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  8. * ********************************************************************************/
复制代码
  1. //进程A
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <sys/sem.h>
  7. #include <unistd.h>
  8. union semun {
  9.     int val;
  10.     struct semid_ds *buf;
  11.     unsigned short *array;
  12. };
  13. int main()
  14. {
  15.         //申请IPC对象的键值
  16.         int key = ftok(".",3);
  17.         //创建信号量集
  18.         int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
  19.         if(sem_id == -1){
  20.                 printf("semget error\n");
  21.                 //如果已经创建,则直接打开
  22.                 sem_id = semget(key,1,0644);
  23.         }
  24.         //设置资源数量
  25.         union semun sem_union;
  26.     sem_union.val = 1;
  27.     semctl(sem_id, 0, SETVAL, sem_union);
  28.     return 0;
  29. }
复制代码
  1. //进程B
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <sys/sem.h>
  7. #include <unistd.h>
  8. int i = 0;
  9. char *shm_map;
  10. union semun {
  11.     int val;
  12.     struct semid_ds *buf;
  13.     unsigned short *array;
  14. };
  15. struct sembuf p_op = {0, -1, SEM_UNDO};
  16. struct sembuf v_op = {0, 1, SEM_UNDO};
  17. int main()
  18. {
  19.         //设置键值
  20.         key_t key1 = ftok(".",2);
  21.         //创建一块共享内存空间
  22.         int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
  23.         if(shm_id == -1){
  24.                 printf("shmget error\n");
  25.                 shm_id = shmget(key1,256,0644);
  26.                
  27.         }
  28.        
  29.         //连接映射空间,并写入数据
  30.         shm_map = (char *)shmat(shm_id,NULL,0);
  31.         //申请IPC对象的键值
  32.         key_t key = ftok(".",3);
  33.         //创建信号量集
  34.         int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
  35.         if(sem_id == -1){
  36.                 printf("semget error\n");
  37.                 //如果已经创建,则直接打开
  38.                 sem_id = semget(key,1,0644);
  39.         }
  40.         while(1){
  41.                 //申请资源
  42.                 semop(sem_id,&p_op,-1);
  43.                 i++;
  44.                 //向内存写入数据
  45.                 sprintf(shm_map,"data = %d\n",i);
  46.                 //归还资源
  47.                 semop(sem_id,&v_op,1);
  48.                 sleep(2);
  49.         }
  50.        
  51.     return 0;
  52. }
复制代码
  1. //进程C
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <sys/sem.h>
  7. #include <unistd.h>
  8. char *shm_map;
  9. union semun {
  10.     int val;
  11.     struct semid_ds *buf;
  12.     unsigned short *array;
  13. };
  14. struct sembuf p_op = {0, -1, SEM_UNDO};
  15. struct sembuf v_op = {0, 1, SEM_UNDO};
  16. int main()
  17. {
  18.         //设置键值
  19.         key_t key1 = ftok(".",2);
  20.         //创建一块共享内存空间
  21.         int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
  22.         if(shm_id == -1){
  23.                 printf("shmget error\n");
  24.                 shm_id = shmget(key1,256,0644);
  25.                
  26.         }
  27.        
  28.         //连接映射空间,并写入数据
  29.         shm_map = (char *)shmat(shm_id,NULL,0);
  30.         //申请IPC对象的键值
  31.         key_t key = ftok(".",3);
  32.         //创建信号量集
  33.         int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
  34.         if(sem_id == -1){
  35.                 printf("semget error\n");
  36.                 //如果已经创建,则直接打开
  37.                 sem_id = semget(key,1,0644);
  38.         }
  39.         while(1){
  40.                 //申请资源
  41.                 semop(sem_id,&p_op,-1);
  42.                
  43.                 //向内存读取数据
  44.                
  45.                 printf("%s\n",shm_map);
  46.                 //归还资源
  47.                 semop(sem_id,&v_op,1);
  48.                 sleep(2);
  49.         }
  50.        
  51.     return 0;
  52. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表