qidao123.com技术社区-IT企服评测·应用市场
标题:
信号量结合共享内存训练
[打印本页]
作者:
愛在花開的季節
时间:
2025-5-8 16:02
标题:
信号量结合共享内存训练
设计程序,进程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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4