【Linux】プロセス間通信---メッセージキュー(IPCリソース)

2213 ワード

System Vメッセージキュー


メッセージキューは、1つのプロセスから別のプロセスに1つのデータを送信する方法を提供し、各データブロックには1つのタイプがあると考えられ、受信者プロセスが受信したデータブロックには異なるタイプの値があり、メッセージキューにはパイプが同じではなく、各メッセージの最大度が上限であり(MSGMAX)、各メッセージキューの総バイト数が上限である(MSGMNB)、システム上のメッセージキューの総数にも1つの上限(MSGMNI)がある.メッセージキューもipcリソースです.IPCリソースは削除する必要があります.そうしないと、再起動しない限り、system V IPCリソースのライフサイクルはカーネルに従います.

msgget関数:メッセージキューの作成とアクセス


機能:メッセージ・キューのプロトタイプを作成およびアクセスするために使用します.
int msgget(key_t key, int msgflg);

パラメータkey:メッセージキューの名前msgflg:9つの権限フラグから構成され、それらの適用法と失敗は-1を返します

msgctl関数msgctl関数:メッセージキューの制御メッセージキュー


機能:メッセージキューの制御関数プロトタイプ
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

パラメータmsqid:msgget関数から返されるメッセージキュー識別コードcmd:は、取得するアクションです(3つの値があります)
コマンド#コマンド#
説明
IPC_STAT
msqid_をds構造のデータがメッセージキューの現在の関連値に設定される
IPC_SET
プロセスに十分な権限があることを前提に、メッセージキューの現在の関連値をmsqid_に設定します.dsデータ構造で与えられた値
IPC_RMID
メッセージキューの削除
戻り値:0が正常に返され、-1が失敗しました.

msgsnd関数:メッセージキューにメッセージを追加


機能:メッセージキューのプロトタイプに1つのメッセージを追加する
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

パラメータmsgid:msgget関数から返されるメッセージキュー識別コードmsgp:は、メッセージタイプを保存するlong intNOWAITテーブル⽰キューが待ちきれず、EAGAINエラーを返します.戻り値:正常に0を返しました.失敗は-1を返します
説明:
1.メッセージ構造は、両方のシナリオにおいて制約を受ける.
12216;まず、システムが規定した上限値に𝞛しなければならない.
次に、受信者関数は、メッセージのタイプを決定するために、long int
2.メッセージ構造の参照形式は以下の通りである.
struct msgbuf {
    long mtype;
    char mtext[1];
    }

 

msgrcv関数:メッセージキューからメッセージを受信する


機能:1つのメッセージキューからメッセージを受信するプロトタイプ
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

パラメータmsgid:msgget関数から返されるメッセージキュー識別コードmsgp:は、受信準備中のメッセージを指すポインタであり、msgsz:msgpが指すメッセージこの
説明:
msgtype=0戻りキュー1番情報msgtype>0戻りキュー1番タイプがmsgtypeに等しいメッセージmsgtype<0戻りキュー1番タイプがmsgtypeの絶対値に等しいメッセージであり、条件が満たされているメッセージタイプが最も好ましいメッセージmsgflg=IPC_NOWAITは、キューに読み取り可能なメッセージがなく待機せず、ENOMSGエラーを返します.msgflg=MSG_NOERRORは、メッセージがmsgszを超えると切断されるmsgtype>0、msgflg=MSG_EXCEPT、受信タイプがmsgtypeに等しくない1番目のメッセージ.

メッセージ・キューの表示と削除:


①ipcs-q共有メモリ関連情報の表示②ipcrm-q(shmid)shmid識別番号の共有メモリの削除