进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的传递,因此需要进程间数据传递、同步与异步的机制。
分类
-
统一主机间进程通信
- Unix进程间通信方式
- 无名通道
- 有名通道
- 信号
- System V进程间通信方式
- 信号量
- 消息队列
- 共享内存
- Unix进程间通信方式
-
不同主机间进程通信
-
- RPC
- Socket
-
消息队列IPC
简单介绍下,所有相关的API函数:
| API函数 | 用途 |
| msgget | 创建一个新的消息队列 |
| 获取消息队列ID | |
| msgsnd | 向消息队列发送消息 |
| msgrcv | 从消息队列接受消息 |
| msgctl | 获得消息队列的信息 |
| 设置消息队列的信息 | |
| 删除消息队列 |
函数原型如下:
// 函数原型 #include <sys/msg.h> int msgget( key_t key, int msgflag); /* key为消息队列的描述符 msgflag是一个设置选项,可以设置权限 返回值为消息队列ID */ int msgctl( int msgid, int cmd, struct msqid_ds *buf); /* msgid是msgget的返回值 cmd :IPC_STAT 获取消息队列当前的状态信息,保存到buf指向的空间 IPC_SET 设置消息队列的属性 IPC_RMID 从内核中删除msgid标识的消息队列 */ int msgsnd( int msgid, struct msgbuf *msgp, size_t msgsz, int msgflag); /* msgid为消息队列ID msgbuf 指向要发送的消息 msgsize 消息的大小 msgflag 操作标志位 */ int msgrcv(int msgid, struct msgbuf *msgbuf, size_t msgsize, long int msgtype, int msgflag); /* msgtype用来指定要接收的消息,分三种情况: 等于 0 返回消息队列中的第一个消息 大于0 返回消息队列中类型为msgtype的第一个消息 小于0 返回消息队列中类型值小于等于msgtype绝对值的消息中类型值最小的第一条消息 */
例子:
1 #include <stdio.h> 2 #include <sys/msg.h> 3 #include <sys/types.h> 4 #include <sys/ipc.h> 5 6 int main() 7 { 8 int msgid; 9 10 //通过这样可以避免标识符的重复 11 //key_t myKey; 12 //myKey = ftok("/home/queues/myqueue", 0); 13 14 msgid = msgget( 0x111, IPC_CREAT|0666); 15 if(msgid >= 0) 16 printf("Created a Msg Queue %d\n", msgid); 17 18 return 0; 19 } 20 21 创建消息队列