【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識別番号の共有メモリの削除
int msgget(key_t key, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
struct msgbuf {
long mtype;
char mtext[1];
}
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);