Linux程序设计----共享内存

来源:互联网 发布:淘宝网显示手机版 编辑:程序博客网 时间:2024/06/05 02:04

   共享内存简介  

(1)共享内存---不相关的进程访问同一个逻辑内存

(2)进程将同一段共享内存映射到自己的地址空间中

(3)对共享内存访问的同步控制必须由程序员来负责

  

  基本函数

//共享内存相关函数头文件#include <sys/shm.h>//创建或者获取共享内存,都是通过它实现int shmget(key_t key, size_t size, int shmflg);//创建的共享内存段,将其映射到一个进程的地址空间void *shmat(int shm_id, const void *shm_addr, int shmflg);
//将共享内存从当前进程中分离(并未删除),当前进程不可再用int shmdt(const void *shm_addr);
//共享内存的控制函数,通过cmd值控制int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

  实现codes

shm_com.h

#define TEXT_SZ 2048struct shared_use_st {  int written_by_you;   /* 1,通知进程有共享数据可读 */  char some_text[TEXT_SZ];};

Consume.c

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include "shm_com.h"//定义共享内存中存放的数据结构int main(){  int running = 1;  void *shared_memory = (void *)0;  struct shared_use_st *shared_stuff;  int shmid;  srand((unsigned int)getpid());  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;  while(running)   {    if (shared_stuff->written_by_you)     {      printf("You wrote: %s", shared_stuff->some_text);      sleep( rand() % 4 ); /* make the other process wait for us ! */      shared_stuff->written_by_you = 0;
      if(strncmp(shared_stuff->som_text, "end", 3) == 0)
running = 0;
    }
  }

  if (shmdt(shared_memory) == -1)   {    fprintf(stderr, "shmdt failed\n");    exit(EXIT_FAILURE);  }  if (shmctl(shmid, IPC_RMID, 0) == -1)   {    fprintf(stderr, "shmctl(IPC_RMID) failed\n");    exit(EXIT_FAILURE);  }  exit(EXIT_SUCCESS);}


Produce.c

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include "shm_com.h"int main(){  int running = 1;  void *shared_memory = (void *)0;  struct shared_use_st *shared_stuff;  char buffer[BUFSIZ];  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;  while(running)   {    while(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(buffer, "end", 3) == 0) {      running = 0;    }  }  if (shmdt(shared_memory) == -1) {    fprintf(stderr, "shmdt failed\n");    exit(EXIT_FAILURE);  }  exit(EXIT_SUCCESS);}

0 0
原创粉丝点击