进程间的通讯 systemV posix

在同一台计算机中的进程相互通信的方式主要有:管道(pipe)、信号(Signal)、信号量(Semaphore)、消息队列(Message)、共享内存(shared memory),其中信号量、消息队列、共享内存被称为IPC机制。
报文队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
共享内存:共享内存是系统创建的特殊地址空间,允许不相关的多个进程使用这个内存空间,即多个进程能够使用同一块内存中的数据,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

System V IPC:
消息队列 信号灯 共享内存区
头文件 <sys/msg.h> <sys/sem.h> <sys/shm.h>
创建或打开IPC的函数 msgget semget shmget :XXXget 创建、获取
控制IPC操作的函数 msgctl semctl shmctl :XXXctl 控制
IPC操作函数 msgsnd、msgrcv semop shmat、shmdt
注意点:
信号量的值小于0时程序不可用 (排队等待) ,信号量的值为0时不能进行p(减)操作,如果进行p操作程序就停下来,直到有程序对其进行v(加)操作,程序恢复(此时信号量为0(+、-))
semget(key,2,IPC_CREAT): 2,不代表创建2个信号量,信号量永远只创建1个(数组),2代表信号量数组的成员有两个(数组(下标,0,1))
semctl(id,0,IPC_RMID):0代表要操作信号量数组下标为0的信号量
semop(id,&info,1);此处的1不是下标,代表操作的信号量数目(你要操作几个信号量)
shm共享内存:(效率高,但不提供同步访问机制)
msg消息队列:(消息队列的长度以及每个消息的大小都是有限制的)
int msgsnd(int msqid,const void *msgptr,size_t msgsize,int msgflg) 函数的作用是将消息发送到消息队列中去, 其中参数msgptr是指想要发送的消息的指针并且指向的缓冲区的第一个字段为长×××,指定消息类型,消息内容存放在该缓冲区得紧跟消息类型字段的区域。

int msgrcv (int msgid,void msgptr,size_t msgsize,long msgtyp,int msgflg); 接收消息
说明 /

msgtyp 大于0:接收消息队列中类型为msg_type的第一个可用报文
等于0:接收消息队列中的第一个可用报文
小于0:接收消息队列中小于或等于msg_type绝对值的第一个可用报文
*/
Posix库与system V的IPC机制有很多相似之处。

转载于:https://blog.51cto.com/13665347/2094474

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值