Linux进程间通信(五)

时间:2022-05-22 19:04:22

共享内存:

  使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

示例:

comm.h

  1 #pragma once
2
3 #include<stdio.h>
4 #include<sys/ipc.h>
5 #include<sys/shm.h>
6
7 #define _PROJ_PATH_ "/tmp"
8 #define _PROJ_ID_ 0x6666
9
10 int creat_shm(int shm_size);
11 int get_shm();
12 int destory_shm(int shm_id);
13 void* at(int shm_id);
14 int dt(void*);
comm.c

  1 #include"comm.h"
2
3 static int comm_shm(int shm_size,int flags)
4 {
5 key_t _key=ftok(_PROJ_PATH_,_PROJ_ID_);
6 if(_key<0)
7 {
8 perror("ftok");
9 return -1;
10 }
11 int shm_id=shmget(_key,shm_size,flags);
12 if(shm_id<0)
13 {
14 perror("shmget");
15 }
16 return shm_id;
17 }
18 int creat_shm(int shm_size)
19 {
20 int flags=IPC_CREAT|IPC_EXCL|0644;
21 return comm_shm(shm_size,flags);
22 }
23 int get_shm()
24 {
25 int flags=IPC_CREAT;
26 return comm_shm(0,flags);
27 }
28 void* at(int shm_id)
29 {
30 return shmat(shm_id,NULL,0);
31 }
32 int dt(void* addr)
33 {
34 return shmdt(addr);
35 }
36 int destory_shm(int shm_id)
37 {
38 if(shmctl(shm_id,IPC_RMID,NULL)<0)
39 {
40 perror("shmctl");
41 return -1;
42 }
43 return 0;
44 }
server.c

  1 #include"comm.h"
2 int main()
3 {
4 int shm_id=creat_shm(4097);
5 char* addr=at(shm_id);
6 int done=0;
7 while(!done)
8 {
9 printf("%s\n",addr);
10 sleep(1);
11 }
12 dt(addr);
13 destory_shm(shm_id);
14 return 0;
15 }
client.c

  1 #include"comm.h"
2
3 int main()
4 {
5 int shm_id=get_shm();
6 char *addr=at(shm_id);
7
8 int done=0;
9 int i=0;
10 while(!done)
11 {
12 addr[i++]='A';
13 addr[i]='\0';
14 sleep(1);
15 }
16 dt(addr);
17 return 0;
18 }
运行结果

Linux进程间通信(五)