进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的传递,因此需要进程间数据传递、同步与异步的机制。

分类

  • 统一主机间进程通信
    • Unix进程间通信方式
      • 无名通道
      • 有名通道
      • 信号
    • System V进程间通信方式
      • 信号量
      • 消息队列
      • 共享内存
  • 不同主机间进程通信
      • 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 创建消息队列
创建消息队列

相关文章: