共享内存的使用
与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h 中。
shmget()函数
该函数用来创建共享内存,它的原型为:
int shmget(key_t key, size_t size, int shmflg);
成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
shmat()函数
第一次创建完共享内存时,它还不能被任何进程访问,shmat()函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下:
void *shmat(int shm_id, const void *shm_addr, int shmflg);
成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
shmdt()函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:
int shmdt(const void *shmaddr);
调用成功时返回0,失败时返回-1.
shmctl()函数
与信号量的semctl()函数一样,用来控制共享内存,它的原型如下:
int shmctl(int shm_id, int command, struct shmid_ds *buf);
消息队列
信号量+共享内存
Linux-interProcessCommunication
总结不足
没有图形化界面
用信号量和共享内存实现的进程通信只能发送数字消息
创建共享内存空间时,设置权限为了省事设置为0666( 每个进程可读和可写),应该要设置user只能读而不能写,other只能写而不能读
消息队列没有测试msgrcv()函数通过改变msgtype参数来改变接收优先级。
> msgtype 可以实现一种简单的接收优先级。如果msgtype为0,就获取队列中的第一个消息。如果它的值大于零,将获取具有相同消息类型的第一个信息。如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。
...
两种方式实现进程间通信的异同
异:消息队列不需要信号量来控制同步和互斥问题,并且可以很方便的改变接收优先级,而共享内存则只能简单的接收按时间排序的消息。
同:一个进程接收到的消息都和另一个进程发送的相同。
心得
由于Linux提供的信号量接口函数都是针对一组信号量进行操作的,因此参数中大部分都需要指定对一组中的哪一个信号量进行操作
共享内存只存放消息缓存区,至于信箱头的那些值仍然存放在各自进程中。
如有不足,欢迎指正!