sys/msg.h中msgget()函数
时间: 2024-05-13 12:16:43 浏览: 11
在Linux/Unix系统中,msgget()函数用于创建或打开一个消息队列(message queue),如果消息队列不存在则创建一个新的消息队列,如果消息队列已经存在则返回该消息队列的标识符(identifier)。该函数原型如下:
```c
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
```
其中,key是用于标识消息队列的键值,msgflg是消息队列的创建标志。
如果msgflg中指定了IPC_CREAT标志,那么如果消息队列不存在,msgget()函数将创建一个新的消息队列,并返回该消息队列的标识符;如果消息队列已经存在,那么msgget()函数将返回该消息队列的标识符。
如果msgflg中同时指定了IPC_CREAT和IPC_EXCL标志,那么如果消息队列已经存在,则msgget()函数将返回错误,并设置errno为EEXIST。
如果msgflg中没有指定IPC_CREAT标志,那么msgget()函数将简单地打开一个已经存在的消息队列,并返回该消息队列的标识符。
注意:在使用msgget()函数创建或打开消息队列之后,还需要使用其他函数来发送和接收消息,例如msgsnd()和msgrcv()函数。同时,使用完消息队列之后需要使用msgctl()函数来删除消息队列。
相关问题
c语言编程用消息队列、sys/msg.h里的函数,实现两个进程间的互相读写
好的,下面是一个简单的示例代码,其中包括了两个进程间的消息队列通信。其中一个进程发送消息,另一个进程接收消息。
发送进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#define MSG_SIZE 256
typedef struct {
long type;
char text[MSG_SIZE];
} message_t;
int main() {
int msg_id;
message_t message;
char text[MSG_SIZE];
// 创建消息队列
msg_id = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if(msg_id == -1) {
perror("msgget failed");
exit(EXIT_FAILURE);
}
// 发送消息
printf("Enter a message: ");
fgets(text, MSG_SIZE, stdin);
message.type = 1;
strncpy(message.text, text, MSG_SIZE);
if(msgsnd(msg_id, &message, sizeof(message_t) - sizeof(long), 0) == -1) {
perror("msgsnd failed");
exit(EXIT_FAILURE);
}
printf("Message sent\n");
// 删除消息队列
if(msgctl(msg_id, IPC_RMID, NULL) == -1) {
perror("msgctl failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
接收进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#define MSG_SIZE 256
typedef struct {
long type;
char text[MSG_SIZE];
} message_t;
int main() {
int msg_id;
message_t message;
// 获取消息队列
msg_id = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if(msg_id == -1) {
perror("msgget failed");
exit(EXIT_FAILURE);
}
// 接收消息
if(msgrcv(msg_id, &message, sizeof(message_t) - sizeof(long), 1, 0) == -1) {
perror("msgrcv failed");
exit(EXIT_FAILURE);
}
printf("Received message: %s", message.text);
// 删除消息队列
if(msgctl(msg_id, IPC_RMID, NULL) == -1) {
perror("msgctl failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
可以在两个不同的命令行窗口中运行这两个程序,分别作为发送进程和接收进程。运行后,发送进程会提示输入要发送的消息,接收进程会等待接收消息,并在接收到消息后打印出来。可以通过修改代码中的消息类型来让不同的进程之间传递不同类型的消息。
c语言编程用消息队列实现两个进程间的互相读写,用sys/msg.h里的函数
好的,下面给出一个简单的例子。
首先,我们需要定义一个消息的结构体,包含消息的类型和内容:
```c
struct message {
long type;
char content[1024];
};
```
然后,我们需要创建两个进程,一个用来发送消息,一个用来接收消息。在这两个进程中,我们都需要创建一个消息队列,用来存储消息。
```c
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int msgid;
struct message msg;
// 创建消息队列
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(1);
}
// 发送消息
msg.type = 1; // 消息类型为1
sprintf(msg.content, "%s", "Hello, world!");
if (msgsnd(msgid, &msg, sizeof(msg.content), 0) == -1) {
perror("msgsnd");
exit(1);
}
// 接收消息
if (msgrcv(msgid, &msg, sizeof(msg.content), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("Received message: %s\n", msg.content);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
```
上面的代码中,我们首先创建了一个消息队列,然后在发送进程中,将消息的类型设为1,内容为"Hello, world!",并发送到消息队列中。在接收进程中,我们从消息队列中读取消息,并打印出来。最后,我们删除消息队列。
注意,在创建消息队列时,我们使用了IPC_PRIVATE作为键值,这意味着这个消息队列只能被创建进程和其子进程访问。如果我们想要在两个独立的进程中使用同一个消息队列,我们需要使用一个已知的键值,比如ftok函数生成的键值。另外,我们还需要注意消息的大小,要确保发送和接收进程中使用的消息大小一致。