msgrcv
是一個用于在 Linux 系統中接收消息隊列消息的系統調用
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
struct msgbuf {
long mtype; // 消息類型
char mtext[256]; // 消息內容
};
key_t key = ftok("/tmp/msgfile", 65); // 使用ftok函數生成鍵值
if (key < 0) {
perror("ftok");
exit(1);
}
int msgid = msgget(key, 0666 | IPC_CREAT); // 使用msgget函數獲取消息隊列ID
if (msgid < 0) {
perror("msgget");
exit(2);
}
msgrcv
接收消息:struct msgbuf rcvbuffer;
long msgtype = 1; // 指定要接收的消息類型,這里接收類型為1的消息
ssize_t size = msgrcv(msgid, &rcvbuffer, sizeof(rcvbuffer.mtext), msgtype, 0);
if (size < 0) {
perror("msgrcv");
exit(3);
}
printf("Received message: type = %ld, text = %s\n", rcvbuffer.mtype, rcvbuffer.mtext);
if (msgctl(msgid, IPC_RMID, NULL) < 0) {
perror("msgctl");
exit(4);
}
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
struct msgbuf {
long mtype;
char mtext[256];
};
int main() {
key_t key = ftok("/tmp/msgfile", 65);
if (key < 0) {
perror("ftok");
exit(1);
}
int msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid < 0) {
perror("msgget");
exit(2);
}
struct msgbuf rcvbuffer;
long msgtype = 1;
ssize_t size = msgrcv(msgid, &rcvbuffer, sizeof(rcvbuffer.mtext), msgtype, 0);
if (size < 0) {
perror("msgrcv");
exit(3);
}
printf("Received message: type = %ld, text = %s\n", rcvbuffer.mtype, rcvbuffer.mtext);
if (msgctl(msgid, IPC_RMID, NULL) < 0) {
perror("msgctl");
exit(4);
}
return 0;
}
編譯并運行上述代碼,即可在 Linux 環境下正確使用 msgrcv
接收消息。注意,你需要先運行發送消息的程序,然后再運行接收消息的程序,以便在消息隊列中有消息可供接收。