信号量进程

img

进程A:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>


int shmmid;
int semid;
int semopid;
struct sembuf buf;

int main()
{

    //创建共享内存段
    key_t key = ftok(".", 10);
    shmmid = shmget( key, 4, IPC_CREAT | 0644);
    if(shmmid == -1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }

    //映射虚拟内存空间
    int  *buffer = (int *)shmat(shmmid, NULL, 0);
    if(buffer == (void *)-1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }


    // 存储Int型数据到共享内存
    *buffer = 0;

     
    //打开信号量集,如果没有则创建
    semid = semget(key,1,IPC_CREAT | 0644);
    if(semid == -1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
     
    buf.sem_num = 0; // 信号量集合中的第一个信号量
    buf.sem_op = 1; // 释放信号量
    buf.sem_flg = 0; //默认值
    

    //操作信号量集
    semopid = semop(semid, &buf, 1);
    if(semopid == -1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }

    printf("shared value is %d\n",*buffer);//打印共享内存的值(为0)

    while(1);
    return 0;
}

进程B:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>


int shmmid;
int semid;
int semopid;
struct sembuf buf;

int main()
{
 
    //打开共享内存段
    key_t key = ftok(".", 10);
    shmmid = shmget( key, 4, 0644);
     if(shmmid == -1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }

    //映射虚拟内存空间
    int  *buffer = (int *)shmat(shmmid, NULL, 0);
    if(buffer == (void *)-1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
 

    //打开信号量集
    semid = semget(key,1,0644);
    if(semid == -1)//判断创建是否出错
    {
        fprintf(stderr,"semget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
    

    buf.sem_num = 0; // 信号量集合中的第一个信号量
    buf.sem_op = -1; // 申请信号量
    buf.sem_flg = 0; //默认值 
    

    //对信号量进行操作
    semopid = semop(semid,&buf,1);
    if(semopid == -1)//判断创建是否出错
    {
        fprintf(stderr,"semop error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }


    //共享内存的值加1 
    (*buffer) += 1; 

    printf("shared value is %d\n",*buffer);//打印共享内存的值

    //buf.sem_op = 1;//重新释放信号量
    //semopid = semop(semid,&buf,1); //对信号量进行操作
   
    return 0;
}

进程C:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>


int shmmid;
int semid;
int semopid;
struct sembuf buf;

int main()
{
 
    //打开共享内存段
    key_t key = ftok(".", 10);
    shmmid = shmget( key, 4, 0644);
     if(shmmid == -1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }

    //映射虚拟内存空间
    int  *buffer = (int *)shmat(shmmid, NULL, 0);
    if(buffer == (void *)-1)//判断创建是否出错
    {
        fprintf(stderr,"shmget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
 

    //打开信号量集
    semid = semget(key,1,0644);
    if(semid == -1)//判断创建是否出错
    {
        fprintf(stderr,"semget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
    

    buf.sem_num = 0; // 信号量集合中的第一个信号量
    buf.sem_op = 0; // 等零操作,此时信号量元素的值为0,不阻塞
    buf.sem_flg = 0;  //默认值

    //对信号量进行操作
    semopid = semop(semid,&buf,1);
    if(semopid == -1)//判断创建是否出错
    {
        fprintf(stderr,"semop error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
    

    (*buffer) += 1;//共享内存的值再加1
    printf("shared value is %d\n",*buffer);//打印共享内存的值
    return 0;
}
posted @   北极甜虾哟  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示