目次
(1) メッセージキュー(ファイルディスクリプタのような)のIDを取得する(msgget)
(3) メッセージキューのプロパティの取得と設定(msgctl)
1. パイプラインの短所
(1) 「指定された」データは、データがマークされておらず、1 つずつ順番にしか読み取れないため、読み取ることができません。
(2) 複数対のプロセス間の相互通信は、複数対のパイプラインで個別に処理する必要がある
2. メッセージキュー
(1) データ識別付きの特別なパイプライン。書き込まれた各データは、識別付きのメッセージになります。
(2) メッセージを読み取るプロセスは、識別子が指定されている限り、他のメッセージに邪魔されずに正しく読み取ることができます。
(3) 実行効果から判断すると、ロゴ付きのメッセージ キューは、複数の同時パイプラインのようです。
3. メッセージキューのAPI
(1) メッセージキュー(ファイルディスクリプタのような)のIDを取得する(msgget)
(2) メッセージの送受信(msgrcv)
a. メッセージを送信する場合、メッセージは次の形式に編成する必要があります。
struct msgbuf
{
long mtype; // 消息的标识
char mtext[1]; // 消息的正文 可以是任何类型数据
};
送信するメッセージは、メッセージの識別子として長いデータで始まる必要があり、その後のデータは必要ありません。
b. メッセージの識別子は任意の長整数値にすることができますが、0L にすることはできません。
c. パラメータ msgsz は、メッセージ ID を除いた、メッセージ内のテキストのサイズです。
(3) メッセージキューのプロパティの取得と設定(msgctl)
4. メッセージキューの使い方
(1)差出人
A) メッセージ キューの ID を取得する
B) 識別子を使用してデータを特別な構造に入れ、メッセージ キューに送信します。
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/msg.h>
struct 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) 指定された ID のメッセージを読み上げます。
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/msg.h>
struct 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;
}