乙荒 发表于 2025-6-2 00:06:47

信号量结合共享内存练习

设计程序,进程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;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 信号量结合共享内存练习