马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
设计程序,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量举行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。进程B对变量举行+1操作,写入共享内存,进程C读取共享内存的数据,并输出。- /********************************************************************************
- *
- *
- * 使用信号量对共享内存进行互斥访问
- * author:jindouliu2024@163.com
- * date:2025.5.8
- * Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved
- * ********************************************************************************/
复制代码- //进程A
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <unistd.h>
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main()
- {
- //申请IPC对象的键值
- int key = ftok(".",3);
- //创建信号量集
- int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
- if(sem_id == -1){
- printf("semget error\n");
- //如果已经创建,则直接打开
- sem_id = semget(key,1,0644);
- }
- //设置资源数量
- union semun sem_union;
- sem_union.val = 1;
- semctl(sem_id, 0, SETVAL, sem_union);
- return 0;
- }
复制代码- //进程B
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <unistd.h>
- int i = 0;
- char *shm_map;
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- struct sembuf p_op = {0, -1, SEM_UNDO};
- struct sembuf v_op = {0, 1, SEM_UNDO};
- int main()
- {
- //设置键值
- key_t key1 = ftok(".",2);
- //创建一块共享内存空间
- int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
- if(shm_id == -1){
- printf("shmget error\n");
- shm_id = shmget(key1,256,0644);
-
- }
-
- //连接映射空间,并写入数据
- shm_map = (char *)shmat(shm_id,NULL,0);
- //申请IPC对象的键值
- key_t key = ftok(".",3);
- //创建信号量集
- int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
- if(sem_id == -1){
- printf("semget error\n");
- //如果已经创建,则直接打开
- sem_id = semget(key,1,0644);
- }
- while(1){
- //申请资源
- semop(sem_id,&p_op,-1);
- i++;
- //向内存写入数据
- sprintf(shm_map,"data = %d\n",i);
- //归还资源
- semop(sem_id,&v_op,1);
- sleep(2);
- }
-
- return 0;
- }
复制代码- //进程C
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <unistd.h>
- char *shm_map;
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- struct sembuf p_op = {0, -1, SEM_UNDO};
- struct sembuf v_op = {0, 1, SEM_UNDO};
- int main()
- {
- //设置键值
- key_t key1 = ftok(".",2);
- //创建一块共享内存空间
- int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
- if(shm_id == -1){
- printf("shmget error\n");
- shm_id = shmget(key1,256,0644);
-
- }
-
- //连接映射空间,并写入数据
- shm_map = (char *)shmat(shm_id,NULL,0);
- //申请IPC对象的键值
- key_t key = ftok(".",3);
- //创建信号量集
- int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
- if(sem_id == -1){
- printf("semget error\n");
- //如果已经创建,则直接打开
- sem_id = semget(key,1,0644);
- }
- while(1){
- //申请资源
- semop(sem_id,&p_op,-1);
-
- //向内存读取数据
-
- printf("%s\n",shm_map);
- //归还资源
- semop(sem_id,&v_op,1);
- sleep(2);
- }
-
- return 0;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |