msgget(),msgrev(),msgctl()
时间: 2023-04-30 09:03:49 浏览: 157
这三个函数都是用于 Linux 系统下的进程间通信。
- msgget() 函数用于创建或获取一个消息队列。如果已经存在该消息队列,则返回其标识符,否则创建一个新的消息队列并返回其标识符。
- msgsnd() 函数用于向消息队列中发送一条消息。需要指定消息队列的标识符、消息指针、消息长度和消息类型等信息。
- msgrcv() 函数用于从消息队列中接收一条消息。需要指定消息队列的标识符、消息指针、消息长度和消息类型等信息。
- msgctl() 函数用于控制消息队列的属性,比如删除消息队列、获取消息队列属性信息等。需要指定消息队列的标识符和控制命令等信息。
这些函数可以在程序中使用,实现不同进程之间的数据传输与同步等功能。
相关问题
使用linux系统提供的系统调用msgget(),msgrev(),msgctl()编制一个长度为1K的消息发送和接受的程序。
以下是一个使用Linux系统调用msgget(), msgrecv(), msgctl()编写的长度为1K的消息发送和接收程序。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSG_SIZE 1024
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[MSG_SIZE]; /* message data */
};
int main(void) {
struct msgbuf buf;
int msqid, len;
key_t key;
if ((key = ftok(".", 'a')) == -1) { // 获取键值
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) { // 获取消息队列标识符
perror("msgget");
exit(1);
}
printf("Enter message to send: ");
fgets(buf.mtext, MSG_SIZE, stdin);
len = strlen(buf.mtext);
if (buf.mtext[len-1] == '\n') {
buf.mtext[len-1] = '\0';
}
buf.mtype = 1; // 消息类型必须大于0
if (msgsnd(msqid, &buf, len+1, 0) == -1) { // 发送消息
perror("msgsnd");
exit(1);
}
printf("Message sent.\n");
if (msgrcv(msqid, &buf, MSG_SIZE, 0, 0) == -1) { // 接收消息
perror("msgrcv");
exit(1);
}
printf("Received message: %s\n", buf.mtext);
if (msgctl(msqid, IPC_RMID, NULL) == -1) { // 删除消息队列
perror("msgctl");
exit(1);
}
return 0;
}
```
该程序首先通过ftok()函数获取一个键值,然后使用msgget()函数获取一个消息队列标识符。接着,它从stdin读取一个消息并将其发送到消息队列中。
在接收方,它使用msgrcv()函数来等待一个消息,并将其存储在buf结构体中。最后,它使用msgctl()函数来删除消息队列。
需要注意的是,消息类型必须大于0,因为消息队列的接收方是按照消息类型来接收消息的。例如,如果一个接收方只接收类型为2的消息,那么它将不会接收到类型为1的消息。
用Linux的msgget(), msgsend(), msgrev()和msgctl()函数写两个程序实现分别进行发送和接收消息
下面是一个简单的示例程序,其中一个程序使用msgsnd()函数发送消息,另一个程序使用msgrcv()函数接收消息。这两个程序使用msgget()和msgctl()函数创建和删除消息队列。
程序1:发送消息
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t key;
int msg_id;
key = ftok("msg_queue", 65); // 生成唯一的消息队列key
msg_id = msgget(key, 0666 | IPC_CREAT); // 创建消息队列并获取其id
message.msg_type = 1;
printf("Enter message: ");
fgets(message.msg, 100, stdin); // 从标准输入获取消息内容
msgsnd(msg_id, &message, sizeof(message), 0); // 发送消息
printf("Message sent: %s\n", message.msg);
msgctl(msg_id, IPC_RMID, NULL); // 删除消息队列
return 0;
}
```
程序2:接收消息
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t key;
int msg_id;
key = ftok("msg_queue", 65); // 使用同一key获取已存在的消息队列
msg_id = msgget(key, 0666 | IPC_CREAT); // 获取消息队列的id
msgrcv(msg_id, &message, sizeof(message), 1, 0); // 接收类型为1的消息
printf("Received message: %s\n", message.msg);
msgctl(msg_id, IPC_RMID, NULL); // 删除消息队列
return 0;
}
```
执行顺序:
1. 先编译并运行程序1,发送一条消息
2. 再编译并运行程序2,接收之前发送的消息
阅读全文