linux进程间的通信----共享内存

共享内存概念


共享内存是最快的进程间通信方式

解释:一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不在涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。

查看创建的共享内存:ipcs -m
删除共享内存段:ipcrm -M key

共享内存函数


1.创建共享内存


shmget函数

int shmget(key_t key,//共享内存段名
           size_t size,//写入填申请空间的大小 打开填0
           int shmflg);//创建IPC_CREAT|0644 打开填0

代码实现为:

  1 #include <stdio.h>
  2 #include <sys/shm.h>
  3 #include <sys/ipc.h>
  4 #include <stdlib.h>
  5 
  6 int main()
  7 {
  8     int id=shmget(1234,sizeof(int),IPC_CREAT|0644);
  9     if(id==-1)
 10         perror("shmget"),exit(1);
 11 }

查看是否创建:
这里写图片描述

2.删除共享内存


shmctl函数

int shmctl(int shmid, //id
           int cmd,//IPC_RMID
           struct shmid_ds *buf);//0
 返回值:成功返回0,失败返回-1

代码实现:

  1 
  2 #include <stdio.h>
  3 #include <sys/shm.h>
  4 #include <sys/ipc.h>
  5 #include <stdlib.h>
  6 
  7 int main()
  8 {
  9     int id=shmget(1234,0,0);//打开共享内存
 10     shmctl(id,IPC_RMID,0);
 11 }

3.生成key


ftok函数:

key_t ftok(const char *pathname,//必须存在的文件名
          int proj_id);//低8位不能全为0

代码实现:

1 #include <sys/ipc.h>
  2 #include <stdio.h>
  3 
  4 int main( void )
  5 {
  6     printf("%d\n", ftok(".", 'a'));
  7 }
  8 

结果为:
这里写图片描述

4.将共享内存挂载到自己的地址空间


shmat函数:

void *shmat(int shmid,//id
            const void *shmaddr,//NULL
            int shmflg);//0
返回值:挂载的虚拟地址空间起始地址,失败返回NULL

5.将共享内存段从挂载的地址空间卸载


shmdt函数:

int shmdt(const void *shmaddr);

代码实现4,5两个函数为:

write.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <sys/ipc.h>
  5 #include <sys/shm.h>
  6 #include <string.h>
  7 
  8 typedef struct stu
  9 {
 10     int age;
 11     char name[4];
 12 }stu_t;
 13 
 14 int main()
 15 {
 16     //创建共享内存
 17     int id=shmget(1234,sizeof(stu_t),IPC_CREAT|0644);
 18     if(id==-1)
 19         perror("shmget"),exit(1);
 20 
 21     stu_t *p=(stu_t*)shmat(id,NULL,0);//挂载到自己的地址空间
 22     int i=1;
 23     while(1)
 24     {
 25         p->age=i++;
 26         sprintf(p->name,"%c",i%26+'a');//a=97,26个英文字母,获取每个字母
 27         printf("write %d ok\n",i-1);
 28         sleep(1);
 29     }
 30 }

read.c

lude <unistd.h>
  3 #include <string.h>
  4 #include <sys/ipc.h>
  5 #include <sys/shm.h>
  6 #include <stdlib.h>
  7 typedef struct stu
  8 {
  9     int age;
 10     char name[4];
 11 }stu_t;
 12 
 13 int main()
 14 {
 15     int id=shmget(1234,0,0);
 16     if(id==-1)
 17         perror("shmget"),exit(1);
 18 
 19     stu_t *p=(stu_t*)shmat(id,NULL,0);
 20     while(1)
 21     {
 22         printf("age=%d, name=%s\n",p->age,p->name);
 23     }
 24 }

运行两个代码如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kai29/article/details/80219434