共享内存:它是system V版本中最高效的一种通信机制,可以使多个进程共享同一地址空间,若有一个进程修改该地址空间,则其它共享该地址空间的进程可以同时看到,但它不提供同步与互斥关系。一般结合信号量来达到进程间的同步于互斥。 

创建共享内存:int shmget(key_t _key,size_t size,int shmflg);//size必须为4096的倍数,即页表大小的倍数。

挂接进程:void* shmat(int shmid,const void* shmaddr,int shmflg);//把当前调用共享内存的进程挂接到指定的地址空间上。一般设置shmflg默认为0,shmaddr一般为NULL

去关联进程:int shmdt(const void *shmaddr)//只需直接修改页表

释放共享内存:int shmctl(int shmid,int cmd,const void* buf);//cmd以IPC_RMID指令立即删除。

share.h

wKioL1cTh62S-blUAABFzihbuBo239.png

share.c文件

wKioL1cUqkyhxHa3AABP7QaU8fA407.png

wKioL1cUqk2hZW_qAAAx_xAI5es298.png

client.c文件

wKiom1cUqY-A9V8NAAA7BJlvELo762.png

server.c文件

wKioL1cUqk3AwAHFAAAnvy8HqRQ358.png

运行结果:

wKiom1cUqZDQ4V4IAABAJbWxM4w989.png

进程间通信的五种方式总结:进程之间之所以要通信,其实是要将它们彼此的数据可以让彼此访问。

管道通信:匿名管道(只适用于有血缘的进程之间进行单向通信,它是存在内存上的一个特殊文件);命名管道(解决了两个无血缘关系的进程之间也可以进行单向通信,它是真实存在于硬盘上的文件,在文件系统中以路径名的形式存在。)它们都是基于字节的。

System V版本下的三种通信机制:

1.消息队列(使两个进程进行双向通信,即一问一答形式)。一个进程可以向队列中添加消息,另一个进程可以从消息队列中读出消息。

2.信号量(通过P,V操作对当前临界资源的访问进行有序的控制访问)。主要作用是进程间或同一进程中的多个线程之间的同步。

3.共享内存(即多个进程可以同时共享某一地址空间内容以及修改其内容,该过程可被其它共享同一地址空间的其他进程看到),它是最高效的。