linux msgget
时间: 2023-11-21 07:03:52 浏览: 29
`msgget` 是 Linux 系统提供的一个函数,用于创建或访问一个消息队列。它的函数原型如下:
```c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
```
其中,`key` 是一个键值,它用于标识一个消息队列,`msgflg` 是控制消息队列创建方式的标志位。如果 `msgget` 函数返回正数,表示创建或访问消息队列成功,返回值为消息队列的标识符;如果返回值为 -1,表示发生了错误,可以通过查看 `errno` 来获取详细的错误信息。
调用 `msgget` 函数时,如果指定的键值对应的消息队列不存在,则会创建一个新的消息队列。如果消息队列已经存在,那么就会返回对应的消息队列标识符。多个进程可以通过相同的键值来访问同一个消息队列。
需要注意的是,消息队列的标识符是一个非负整数,它可以被用作其他与消息队列相关的函数的参数,例如 `msgsnd` 和 `msgrcv` 等。
相关问题
linux msgget使用
msgget是Linux进程间通信(IPC)中的一个函数,用于创建或者打开一个消息队列。具体使用方法如下:
```c++
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
```
参数说明:
- key:消息队列关键字,一个整数值,不同的值代表不同的消息队列。
- msgflg:flags参数,表示消息队列的操作模式,取值可以是以下几种模式的或者:
| 模式标志 | 描述 |
| :------- | :-------------------------- |
| IPC_CREAT | 如果没有此消息队列则创建一个,如果已存在则返回该消息队列的ID |
| IPC_EXCL | 与IPC_CREAT一起使用,若该消息队列已存在,则返回错误码 |
| IPC_PRIVATE | 该标志唯一的用途就是与IPC_RMID一起使用 |
返回值:
- 若调用成功,则返回一个非负整数——消息队列的ID。
- 若出现错误,则返回-1,并设置errno为相应值。
示例代码:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_MAX_SIZE 1024
struct msgbuf
{
long mtype;
char mtext[MSG_MAX_SIZE];
};
int main(int argc, char **argv)
{
int msgid = 0;
key_t key = 123456;
struct msgbuf msg;
memset(&msg, 0x00, sizeof(struct msgbuf));
// 通过key创建或打开一个消息队列
msgid = msgget(key, IPC_CREAT);
if (msgid == -1)
{
printf("%d:%s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
printf("create msg queue :%d\n", msgid);
// 发送消息到消息队列
msg.mtype = 1;
strcpy(msg.mtext, "hello, this is a message!");
if (msgsnd(msgid, (void *) &msg, MSG_MAX_SIZE, IPC_NOWAIT) == -1)
{
printf("%d:%s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
printf("send message success\n");
return 0;
}
```
在这个示例程序中,我们定义了一个`struct msgbuf`结构体用来存放消息,其中`long mtype`是消息类型,`char mtext[MSG_MAX_SIZE]`是消息文本内容。在程序中,我们通过`msgget`函数创建或打开一个消息队列,然后利用`msgsnd`函数向消息队列中发送一条消息。
需要注意的是,msgget成功调用后,我们最好存储一下返回的msgid,以便于后面在程序中使用。而在Linux下,使用IPC通讯时,需要定义key值,用于标识IPC通讯中的对象,这个key可以是手动指定的,比如这个示例程序中的123456,也可以使用ftok函数从指定的文件路径中生成。唯一的要求是,所有使用IPC通讯的进程使用的key值必须是一样的。
Linux的msgget函数第二个参数
Linux的msgget函数第二个参数是一个键值(key),用于标识消息队列。这个键值是由ftok函数生成的。ftok函数需要传入一个文件名和一个整数,用于生成一个唯一的键值。msgget函数根据这个键值来创建或获取已有的消息队列。如果不存在对应的消息队列,则创建一个新的消息队列。如果已经存在对应的消息队列,则获取该消息队列的标识符。