sem_open 子例程

用途

初始化并打开指定的信号量。

标准 C 库 (libc.a)

语法

#include <semaphore.h>

sem_t * sem_open (const char *name, int oflag, mode_t mode, unsigned value)

描述

sem_open 子例程在指定的信号量和进程之间建立连接。 在使用信号量名称 name调用 sem_open 子例程之后,进程可以使用从调用返回的地址来引用信号量。 此信号可用于对 sem_waitsem_trywaitsem_postsem_close 子例程的后续调用。 在成功调用 sem_close_exit或其中一个 exec 子例程来关闭信号之前,此进程仍可使用信号量。

name 参数指向命名信号量对象的字符串。 该名称在文件系统中没有表示。 name 参数符合路径名的构造规则。 它可以以斜杠字符开头,并且必须至少包含一个字符。 调用具有相同值 namesem_open () 的进程引用相同的信号量对象,只要尚未除去该名称。

如果进程对具有相同 name 参数值的 sem_open 子例程进行多次成功调用,那么将针对每个此类成功调用返回相同的信号量地址,前提是尚未对此信号量调用 sem_unlink 子例程。

参数

描述
名称 指向用于命名信号量对象的字符串。
oflag 控制是通过调用 sem_open 子例程来创建还是仅仅访问信号量。 可以在 oflag 参数中设置以下标志位:
O_CREAT
此标志用于创建信号量 (如果它尚不存在)。 如果设置了 O_CREAT 标志并且信号已经存在,那么 O_CREAT 标志没有作用,除非在 O_EXCL 标志的描述下说明。 否则, sem_open 子例程将创建指定的信号量。 O_CREAT 标志需要第三个和第四个参数: mode(类型为 mode_t) 和 value。 类型为 unsigned。 将使用初始值 value创建信号量。 semaphores 的有效值小于或等于 SEM_VALUE_MAX

信号量的用户标识设置为进程的有效用户标识。 信号量的组标识设置为进程的有效组标识。 信号量的许可权位设置为 mode 参数的值,但在进程的文件方式创建掩码中设置的值除外。 当设置文件许可权位以外的其他方式的位时,它们没有任何作用。 当设置文件许可权位以外的其他方式的位时,它们没有任何作用。

sem_open 子例程使用 O_CREAT 标志创建名为 name 的信号之后, 其他进程可以通过调用具有相同值 namesem_open 子例程来连接到信号量。

O_EXCL
如果设置了 O_EXCLO_CREAT 标志,那么如果信号量名称存在,那么 sem_open 子例程将失败。 对于执行带有 O_EXCLO_CREAT 标志集的 sem_open 子例程的其他进程而言,检查信号量是否存在以及是否创建信号量 (如果不存在) 是原子的。 如果设置了 O_EXCL 并且未设置 O_CREAT ,那么将忽略 O_EXCL 。 如果在 oflag 参数中指定了除 O_CREATO_EXCL 以外的标志,那么它们没有作用。
方式 指定文件许可权位的值。 与 O_CREAT 配合使用以创建消息队列。
value 指定初始值。 与 O_CREAT 配合使用以创建消息队列。

返回值

成功完成时, sem_open 子例程返回信号量的地址。 否则,它将返回值 SEM_FAILED 并设置 errno 以指示错误。 SEM_FAILED 符号在 semaphore.h 头文件中定义。 sem_open 子例程未成功返回值 SEM_FAILED

错误代码

如果出现下列任何情况,那么 sem_open 子例程将返回 SEM_FAILED 并将 errno 设置为相应的值:
描述
EACCES 指定的信号量存在,并且 oflag 指定的许可权被拒绝。
EEXIST 设置了 O_CREATO_EXCL 标志,并且指定的信号量已存在。
Efault 用户地址无效。
EINVAL 对于给定的名称,不支持 sem_open 子例程。 或者在 oflag 参数中指定了 O_CREAT 标志,并且 value 大于 SEM_VALUE_MAX
EMFILE 此进程当前正在使用过多的信号描述符。
ENAMETOOLONG name 参数的长度超过 PATH_MAX,或者路径名组件的长度超过 NAME_MAX
ENFILE 系统中当前打开的信号量过多。
ENOENT 未设置 O_CREAT 标志,并且指定的信号量不存在。
ENOMEM 内存不足,无法执行必需的操作。
ENOTSUP 已执行 checkpoint-restart'ed的进程不支持此功能。
ENOSPC 没有足够的空间来创建新的指定信号量。