5. オペレーティングシステム - プロセス間通信 (3) (システム V-IPC: メッセージキュー)

目次

1. パイプラインの短所

2. メッセージキュー

3. メッセージキューのAPI

  (1) メッセージキュー(ファイルディスクリプタのような)のIDを取得する(msgget)

  (2) メッセージの送受信(msgrcv)

    (3) メッセージキューのプロパティの取得と設定(msgctl)

4. メッセージキューの使い方

(1)差出人

(2) 受信機

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;
}

おすすめ

転載: blog.csdn.net/weixin_45981798/article/details/129780424