栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【linux】共享内存、消息队列

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【linux】共享内存、消息队列

共享内存、消息队列

  1. A 往共享内存中写 ,B从共享内存中读(一次读一个)

    思考:
    得加锁,不然A 写了 B 一直在读取,结束不了,只有在A进程结束时 ,B才结束。
    所以应该设置两个信号量,控制AB的写和读

shma.c

#include
#include
#include
#include
#include
#include
#include"sem.h"
int main()
{
    int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);
    assert(shmid != -1);
    
    char* s= (char*) shmat(shmid,NULL,0);
   
    sem_init();

   while(1)
   {
      printf("input:n");
     char buff[128] ={0};
     fgets(buff,128,stdin);
        
     sem_p(SEM1);
     strcpy(s,buff);//xianggongxiangneicunxierushuju
    
     sem_v(SEM2);

     if(strncmp(buff,"end",3)==0)
     {
        break;
     }
   }

    shmdt(s);
}

shmb.c

#include
#include
#include
#include
#include
#include
#include"sem.h"
int main()
{
    int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);
    assert(shmid != -1);
    
    char* s= (char*) shmat(shmid,NULL,0);
    
   sem_init(); 
    while(1)
    {
        sem_p(SEM2);
        if(strncmp(s,"end",3) == 0)
        {
            break;
        }

         printf("read:%sn",s);
        sem_v(SEM1);
    }
    shmdt(s);
    sem_destory();
}


sem.h

#include
#include
#include
#include
#include

#define SEM_NUM   2
#define SEM1    0
#define SEM2   1 
//#define SEM3   2


union semun 
{
    int val;
};

int sem_init();
void sem_p(int index);
void sem_v(int index);
void  sem_destory();


sem.c

#include"sem.h"
static int semid = -1;

int sem_init()
{
    semid = semget((key_t)1234,SEM_NUM,IPC_CREAT|IPC_EXCL|0600);
    if(semid == -1)
    {
        semid = semget((key_t)1234,SEM_NUM,0600);
        if(semid == -1)
        {
            printf("semget errn");
            return -1;
        }
    }
    else 
    {
        int arr[SEM_NUM] = {1,0};
        for(int i = 0;i= SEM_NUM)
   {
       return ;
   }

   struct sembuf buf;
   buf.sem_num = index ;
   buf.sem_op = -1;//p
   buf.sem_flg = SEM_UNDO;

   if( semop(semid,&buf,1) == -1)
   {
       return ;
   }
}
void sem_v(int index)
{
   if(index <0 || index >= SEM_NUM)
   {
      return ;
   }
 
   struct sembuf buf;
   buf.sem_num = index ;
   buf.sem_op =1;//v
   buf.sem_flg = SEM_UNDO;
 
   if(semop(semid,&buf,1) == -1)
   {
        return ;
   }
}


void sem_destory()
{
    if(semctl(semid,0,IPC_RMID) == -1)
    {
        return ;
    }
}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/460458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号