信号量结合共享内存练习

设计程序,进程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;
}
作者:LRadian原文地址:https://www.cnblogs.com/lradian/p/18866695

%s 个评论

要回复文章请先登录注册