> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/sys/shmget.2.md).

# shmget(2)

`shmget` — 获取共享内存标识符

## 名称

`shmget`

## 库

Lb libc

## 概要

`#include <sys/shm.h>`

```c
int
shmget(key_t key, size_t size, int flag);
```

## 描述

根据 `key` 和 `flag` 的值，`shmget()` 返回一个新建或已存在的共享内存段的标识符。key 类似于文件名：它提供了一个命名 IPC 对象的句柄。指定 key 的方式有三种：

* 可以指定 IPC\_PRIVATE，在这种情况下将创建一个新的 IPC 对象。
* 可以指定一个整数常量。如果不存在与 `key` 对应的 IPC 对象，且 `flag` 中设置了 IPC\_CREAT 位，则会创建一个新的 IPC 对象。
* 可以使用 [ftok(3)](/gen/ftok.3.md) 从路径名生成一个 key。

新创建的 IPC 对象的模式通过将这些常量按位或到 `flag` 参数中来确定：

**`0400`** 所有者读权限。

**`0200`** 所有者写权限。

**`0040`** 组读权限。

**`0020`** 组写权限。

**`0004`** 其他用户读权限。

**`0002`** 其他用户写权限。

创建新的共享内存段时，`size` 指示新段的期望大小（以字节为单位）。段的大小可能会向上取整到内核方便的倍数（即页面大小）。

## 返回值

成功完成后，`shmget()` 返回共享内存段的正整数标识符。否则返回 -1，并设置 `errno` 以指示错误。

## 错误

`shmget()` 系统调用在以下情况下会失败：

**\[`EINVAL`]** 指定的大小大于先前已存在段的大小。指定的大小小于系统规定的最小值，或大于系统规定的最大值。

**\[`ENOENT`]** 未找到匹配 `key` 的共享内存段，且未指定 IPC\_CREAT。

**\[`ENOSPC`]** 内核无法分配足够的内存来满足请求。

**\[`EEXIST`]** 指定了 IPC\_CREAT 和 IPC\_EXCL，且与 `key` 对应的共享内存段已存在。

## 参见

[shmat(2)](/sys/shmat.2.md), [shmctl(2)](/sys/shmctl.2.md), [shmdt(2)](/sys/shmat.2.md), [ftok(3)](/gen/ftok.3.md)
