共享内存:它是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
share.c文件
client.c文件
server.c文件
运行结果:
进程间通信的五种方式总结:进程之间之所以要通信,其实是要将它们彼此的数据可以让彼此访问。
管道通信:匿名管道(只适用于有血缘的进程之间进行单向通信,它是存在内存上的一个特殊文件);命名管道(解决了两个无血缘关系的进程之间也可以进行单向通信,它是真实存在于硬盘上的文件,在文件系统中以路径名的形式存在。)它们都是基于字节的。
System V版本下的三种通信机制:
1.消息队列(使两个进程进行双向通信,即一问一答形式)。一个进程可以向队列中添加消息,另一个进程可以从消息队列中读出消息。
2.信号量(通过P,V操作对当前临界资源的访问进行有序的控制访问)。主要作用是进程间或同一进程中的多个线程之间的同步。
3.共享内存(即多个进程可以同时共享某一地址空间内容以及修改其内容,该过程可被其它共享同一地址空间的其他进程看到),它是最高效的。
原文地址:http://10541559.blog.51cto.com/10531559/1765121