城乡建设部网站察周圣进证件,网站建设经营特色,WordPress修改数据库地址,wordpress 3.5目录
1、管道的缺点
2、消息队列
3、消息队列的API #xff08;1#xff09;获取消息队列的ID#xff08;类似文件的描述符#xff09;(msgget) #xff08;2#xff09;发送、接收消息(msgrcv) (3)获取和设置消息队列的属性#xff08;msgctl#xff09;
4、消息队…目录
1、管道的缺点
2、消息队列
3、消息队列的API 1获取消息队列的ID类似文件的描述符(msgget) 2发送、接收消息(msgrcv) (3)获取和设置消息队列的属性msgctl
4、消息队列的使用方法
1发送者
2接收者 1、管道的缺点
1无法读取一个“指定”的数据因为数据没有标记故只能按次序挨个读取
2多对进程之间的相互通信要用多对管道分别处理
2、消息队列
1有数据标识的特殊管道每一段被写入的数据都变成带标识的消息。
2读取消息的进程只要指定标识就可以正确读取而不会受到其他消息干扰
3从运行效果看一个带标识的消息队列就像多条并存的管道
3、消息队列的API
1获取消息队列的ID类似文件的描述符(msgget) 2发送、接收消息(msgrcv) a、发送消息时消息必须被组织成以下形式
struct msgbuf
{long mtype; // 消息的标识char mtext[1]; // 消息的正文 可以是任何类型数据
};发送出去的消息必须以一个 long 型数据打头作为该消息的标识后面的数据则没有要求。
b、消息的标识可以是任意长整型数值但不能是 0L。
c、参数 msgsz 是消息中正文的大小不包含消息的标识。
(3)获取和设置消息队列的属性msgctl 4、消息队列的使用方法
1发送者 A) 获取消息队列的 ID B) 将数据放入一个附带有标识的特殊的结构体发送给消息队列。 #include sys/types.h
#include sys/ipc.h
#include stdio.h
#include sys/msg.hstruct msgbuf
{long mtype; // 【重点】消息的标识int num ; // 消息的正文 可以是任何类型数据
};int main(int argc, char const *argv[])
{// 获得KEY值key_t key ftok(./, 1 );printf(key:%d\n , key );// 获得消息队列的ID int ID msgget( key , IPC_CREAT | 0644 );printf(消息队列ID 为%d \n , ID );// 配置消息struct msgbuf msg {.mtype X, // 设置消息数据的类型标识.num 1024 // 实际发送的信息};// 发送消息msgsnd(ID , msg , sizeof(msg.num), MSG_NOERROR);// 标记删除msgctl(ID , IPC_RMID , NULL );return 0;
}2接收者 A) 获取消息队列的 ID B) 将指定标识的消息读出。 #include sys/types.h
#include sys/ipc.h
#include stdio.h
#include sys/msg.hstruct msgbuf
{long mtype; // 【重点】消息的标识int num ; // 消息的正文 可以是任何类型数据
};int main(int argc, char const *argv[])
{// 获得KEY值key_t key ftok(./, 1 );printf(key:%d\n , key );// 获得消息队列的ID int ID msgget( key , IPC_CREAT | 0644 );printf(消息队列ID 为%d \n , ID );// 配置消息struct msgbuf msg {0};// 接收消息// int msg ; int ret_val msgrcv( ID , msg, sizeof(msg.num), X, MSG_NOERROR );printf(ret:%d msg:%d\n , ret_val, msg.num );// 标记删除msgctl(ID , IPC_RMID , NULL );return 0;
}