你的位置:首页 > 操作系统

[操作系统]进程间通讯之共享内存


共享内存是被多个时程共享的一部份物理内存,共享内存是进程间共享数据的一种最快的方法。

头文件:#include<sys/types.h>         #include<sys/shm.h>

A:创建共享内存。

int shmget(key_t key,int size,int shmflg)

1、key:键值,由ftok函数获得。

2、size:创建共享内存的大小。

3、shmflg:标识位。

成功返回共享内存标识符,失败返回-1。

B:映射共享内存。

int shmat(int shmid,char *shmaddr,int flag)

1、shmid:shmget函数返回的共享内存标识符。

2、flag:决定以什么方式来确定映射的地址(通常为NULL)。

成功返回共享内存映射到进程中的地址,失败返回-1。

C:删除映射

int shmdt(char *shmddr)

D:清除共享内存

int shmctl(int shmid,int cmd,struct shmid_ds *buf)

 

例子:两个进程利用共享内存相互通信

server.c

 1 /************************************************************************* 2   > File Name: server1.c 3   > Author: xu 4   > Mail: eeexu123@163.com  5   > Created Time: 2016年10月09日 星期日 14时38分18秒 6  ************************************************************************/ 7  8 #include<stdio.h> 9 #include<stdlib.h>10 #include<signal.h>11 #include<sys/stat.h>12 #include<sys/types.h>13 #include<fcntl.h>14 #include<unistd.h>15 #include<sys/shm.h>16 #include<sys/ipc.h>17 #define BUFFER_SIZE 12818 19 void myfun()20 {21   return;22 }23 24 int main()25 {26   struct mybuf27   {28     int pid;29     char buf[BUFFER_SIZE];30   };31   32   int key,shmid;33   int pid;34   struct mybuf *p;35   //注册SIGUSR1到函数中36   signal(SIGUSR2,myfun);37   key = ftok("./e.c",'a');38   if(key < 0)39   {40     printf("creat two process error\n");41     exit(1);42   }43   //创建共享内存44   shmid = shmget(key,BUFFER_SIZE,IPC_CREAT|S_IRWXU);45   if(shmid < 0)46   {47     perror("shmget");48     exit(1);49   }50   printf("create share memory success\n");51   //映射共享内存52   p = (struct mybuf *)shmat(shmid,NULL,0);53   if(p == NULL)54   {55     perror("shmat");56     exit(1);57   }58   printf("map the share memory success\n");59   60   p->pid = getpid();  //把服务器PID写入共享内存中61 62   pause();  //等待客户端63 64   pid = p->pid;  //读取客户端PID65 66   while(1)67   {68     printf("parent process start write share memory\n");69     fgets(p->buf,124,stdin);70     kill(pid,SIGUSR1);71     pause();72   }73   shmdt(p);74   shmctl(shmid,IPC_RMID,NULL);75   76   return 0;77 }

 

client.c

/*************************************************************************  > File Name: client1.c  > Author: xu  > Mail: eeexu123@163.com   > Created Time: 2016年10月09日 星期日 14时38分30秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>#include<unistd.h>#include<sys/shm.h>#include<sys/ipc.h>#define BUFFER_SIZE 128void my_fun(){  return;}int main(){  struct my_buf  {    int pid;    char buf[BUFFER_SIZE];  };    int key,shmid;  int pid;  struct my_buf *p;  //注册SIGUSR2到函数中  signal(SIGUSR1,my_fun);  key = ftok("./e.c",'a');  if(key < 0)  {    perror("fotk");    exit(1);  }  //创建共享内存  shmid = shmget(key,BUFFER_SIZE,IPC_CREAT|S_IRWXU);  if(shmid < 0)  {    perror("shmget");    exit(1);  }  //映射共享内存  p = (struct my_buf *)shmat(shmid,NULL,0);  if(p == NULL)  {    perror("shmat");    exit(1);  }  printf("map the share memory success\n");     pid = p->pid;  //读取服务器PID  p->pid = getpid();  //将客户端PID写入共享内存中  kill(pid,SIGUSR2);  //给服务器发信号  while(1)  {    pause();    printf("client process recave data form share memory:%s\n",p->buf);    kill(pid,SIGUSR2);  }    shmdt(p);  shmctl(shmid,IPC_RMID,NULL);    return 0;}