共享内存 shm

往共享内存中写:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "shm_com.h"
#include <sys/shm.h>

#include <sys/types.h>
#include <sys/ipc.h>


int main()
{
  int running=1;
  void *shared_memory=(void *)0;//??
  struct shared_use_st *shared_stuff;
  int shmid;
  char buffer[BUFSIZ];
 /*创建共享内存*/
 shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
 if(shmid==-1)
  {
    fprintf(stderr,"shmget failed \n");
    exit(EXIT_FAILURE);
   }
  /*映射共享内存*/
 shared_memory=shmat(shmid,(void *)0,0);
 if(shared_memory==(void *)-1)
   {
      fprintf(stderr,"shmat failed \n");
      exit(EXIT_FAILURE);
   }
  printf("memory attached at %X \n",(int)shared_memory);
  /*让结构体指针指向这块内存*/
 shared_stuff=(struct shared_use_st *)shared_memory;
 /*控制读写顺序*/
 shared_stuff->written_by_you=0;
 /*循环向共享内存中写数据,直到写到“end"为止*/
 while(running)
{  
   if(shared_stuff->written_by_you==1)
    {
       
       // sleep(1);//??读进程读了之后再写
        printf("waiting for client...\n");
       
     }
  printf("enter some text:");
  fgets(buffer,BUFSIZ,stdin);
  strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
  shared_stuff->written_by_you=1;
        if(strncmp(shared_stuff->some_text,"end",3)==0)  
         {
           running=0;//结束循环
           }
}
 
  /*删除共享内存*/
  if(shmdt(shared_memory)==-1)
   {
     fprintf(stderr,"shmdt failed \n");
     exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}

读共享内存:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "shm_com.h"
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>

int main()
{
  int running=1;
  void *shared_memory=(void *)0;//??
  struct shared_use_st *shared_stuff;
  int shmid;
 /*创建共享内存*/
 shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
 if(shmid==-1)
  {
    fprintf(stderr,"shmget failed \n");
    exit(EXIT_FAILURE);
   }
  /*映射共享内存*/
 shared_memory=shmat(shmid,(void *)0,0);
 if(shared_memory==(void *)-1)
   {
      fprintf(stderr,"shmat failed \n");
      exit(EXIT_FAILURE);
   }
  printf("memory attached at %X \n",(int)shared_memory);
  /*让结构体指针指向这块内存*/
 shared_stuff=(struct shared_use_st *)shared_memory;
 /*控制读写顺序*/
 shared_stuff->written_by_you=0;
 /*循环从共享内存中读数据,直到读到“end"为止*/
 while(running)
{  
 
   if(shared_stuff->written_by_you)
    {
        printf("You wrote : %s",shared_stuff->some_text);
       // sleep(1);//??读进程睡一秒,同时会使写进程睡一秒,这样做到读了之后再写
        shared_stuff->written_by_you=0;
        if(strncmp(shared_stuff->some_text,"end",3)==0)  
         {
           running=0;//结束循环
           
           }
     }
}
 
  /*删除共享内存*/
  if(shmdt(shared_memory)==-1)
   {
     fprintf(stderr,"shmdt failed \n");
     exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}

/*
fprintf是C/C++中的一个格式化写—库函数;其作用是格式化输出到一个流/文件中;
  函数完整形式: int fprintf(FILE *stream,char *format,[argument])
*/

/*
函数名: strncmp
  功 能: 串比较
  用 法: int strncmp(char *str1, char *str2, int maxlen);
  说明:此函数功能即比较字符串str1和str2的前maxlen个字符。如果前maxlen字节完全相等,返回值就=0;在前maxlen字节比较过程中,如果出现str1[n]与str2[n]不等,则返回(str1[n]-str2[n])。
*/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值