先决条件:进程间通信
消息队列是存储在内核中并由消息队列标识符标识的消息的链接列表。由msgget()创建一个新队列或打开一个现有队列。
通过msgsnd()将新消息添加到队列的末尾。每个消息都有一个正长整数类型字段,一个非负长度,以及实际数据字节(与长度相对应),当将消息添加到队列时,所有这些都指定给msgsnd()。消息是通过msgrcv()从队列中提取的。我们不必按先进先出的顺序获取消息。相反,我们可以根据消息的类型字段来获取消息。
所有进程都可以通过访问公共系统消息队列来交换信息。发送进程将消息(通过某些(OS)消息传递模块)放置到队列中,该队列可以被另一个进程读取。每条消息都有一个标识或类型,以便进程可以选择适当的消息。进程必须共享一个公用密钥,以便首先获得对队列的访问权。
用于消息队列的系统调用:
- ftok() :用于生成唯一密钥。
- msgget() :返回新创建的消息队列的消息队列标识符,或者返回存在具有相同键值的队列的标识符。
- msgsnd() :通过调用msgsnd()将数据放置到消息队列中。
- msgrcv() :从队列中检索消息。
- msgctl() :它在队列上执行各种操作。通常,它用于销毁消息队列。
写入过程的消息队列
C
// C Program for Message Queue (Writer Process)
#include
#include
#include
#define MAX 10
// structure for message queue
struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;
int main()
{
key_t key;
int msgid;
// ftok to generate unique key
key = ftok("progfile", 65);
// msgget creates a message queue
// and returns identifier
msgid = msgget(key, 0666 | IPC_CREAT);
message.mesg_type = 1;
printf("Write Data : ");
fgets(message.mesg_text,MAX,stdin);
// msgsnd to send message
msgsnd(msgid, &message, sizeof(message), 0);
// display the message
printf("Data send is : %s \n", message.mesg_text);
return 0;
}
C
// C Program for Message Queue (Reader Process)
#include
#include
#include
// structure for message queue
struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;
int main()
{
key_t key;
int msgid;
// ftok to generate unique key
key = ftok("progfile", 65);
// msgget creates a message queue
// and returns identifier
msgid = msgget(key, 0666 | IPC_CREAT);
// msgrcv to receive message
msgrcv(msgid, &message, sizeof(message), 1, 0);
// display the message
printf("Data Received is : %s \n",
message.mesg_text);
// to destroy the message queue
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
阅读程序的消息队列
C
// C Program for Message Queue (Reader Process)
#include
#include
#include
// structure for message queue
struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;
int main()
{
key_t key;
int msgid;
// ftok to generate unique key
key = ftok("progfile", 65);
// msgget creates a message queue
// and returns identifier
msgid = msgget(key, 0666 | IPC_CREAT);
// msgrcv to receive message
msgrcv(msgid, &message, sizeof(message), 1, 0);
// display the message
printf("Data Received is : %s \n",
message.mesg_text);
// to destroy the message queue
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
输出:
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。