信号量集和共享内存段共用
待补齐
A(联合体应主动补齐)
查看代码
/*************************************************
* filename:shm_semA.c
* function: 进程A创建一个信号量集,要求信号量集中只有一个信号量,
* 队信号量集中的信号进行设置,要求集合中的信号量初值为1,
* 再创建一个共性内存段存放int型的data,
* 再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
* B进程使data+1,C进程打印data的值
* date:2025.6.10
* note:
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
void main(){
//创建一个共享内存
int shm_id = shmget(ftok(".",0x11),4,IPC_CREAT|0664|IPC_EXCL);
if(shm_id == -1){
fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
shm_id = shmget(ftok(".",0x11),4,0664);
}
int * addr = (int *)shmat(shm_id,NULL,0);
if(addr == (void *)-1){
fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
}
*addr=0;
shmdt(addr);
//创建共享信号量集
int sem_id = semget(ftok(".",0x12),1,IPC_CREAT|0644);
if(sem_id == -1){
fprintf(stderr,"semget error,errno:%d,%s",errno,strerror(errno));
}
union semun sem_arg;
sem_arg.val=1;
if( -1 == semctl(sem_id,0,SETVAL,sem_arg))
{
fprintf(stderr,"semget error,errno:%d,%s",errno,strerror(errno));
}
}
B
查看代码 /*************************************************
* filename:shm_semB.c
* function: 进程A创建一个信号量集,要求信号量集中只有一个信号量,
* 队信号量集中的信号进行设置,要求集合中的信号量初值为1,
* 再创建一个共性内存段存放int型的data,
* 再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
* B进程使data+1,C进程打印data的值
* date:2025.6.10
* note:
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>
void main(){
//1.打开共享内存段
int shm_id = shmget(ftok(".",0x11),4,0644);
if(shm_id == -1){
fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
}
int * addr = shmat(shm_id,NULL,0);
if(addr == (void *)-1){
fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
}
//打开信号量集
int sem_id = semget(ftok(".",0x12),0,0664);
struct sembuf sem_p;
sem_p.sem_num=0;
sem_p.sem_op=-1;
sem_p.sem_flg=0;
struct sembuf sem_v;
sem_v.sem_num=0;
sem_v.sem_op=1;
sem_v.sem_flg=0;
while(1){
//p操作
semop(sem_id,&sem_p,1);
printf("******************进行data+1***********************\n");
*addr += 1;
//v操作
semop(sem_id,&sem_v,1);
sleep(3);
}
}
C
查看代码 /*************************************************
* filename:shm_semC.c
* function: 进程A创建一个信号量集,要求信号量集中只有一个信号量,
* 队信号量集中的信号进行设置,要求集合中的信号量初值为1,
* 再创建一个共性内存段存放int型的data,
* 再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
* B进程使data+1,C进程打印data的值
* date:2025.6.10
* note:
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>
void main(){
//1.打开共享内存段
int shm_id = shmget(ftok(".",0x11),4,0644);
if(shm_id == -1){
fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
}
int *addr = shmat(shm_id,NULL,0);
if(addr == (void *)-1){
fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
}
//2.连接信号量集
int sem_id = semget(ftok(".",0x12),1,0644);
struct sembuf sem_p;
sem_p.sem_num=0;
sem_p.sem_op=-1;
sem_p.sem_flg=0;
struct sembuf sem_v;
sem_v.sem_num=0;
sem_v.sem_op=1;
sem_v.sem_flg=0;
while(1){
semop(sem_id,&sem_p,1);
printf("**********************************************\n");
printf("data = %d\n",*addr);
printf("**********************************************\n");
semop(sem_id,&sem_v,1);
sleep(3);
}
}

浙公网安备 33010602011771号