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_wait, sem_trywait, sem_post和 sem_close 子例程的后续调用。 在成功调用 sem_close, _exit或其中一个 exec 子例程来关闭信号之前,此进程仍可使用信号量。
name 参数指向命名信号量对象的字符串。 该名称在文件系统中没有表示。 name 参数符合路径名的构造规则。 它可以以斜杠字符开头,并且必须至少包含一个字符。 调用具有相同值 name 的 sem_open () 的进程引用相同的信号量对象,只要尚未除去该名称。
如果进程对具有相同 name 参数值的 sem_open 子例程进行多次成功调用,那么将针对每个此类成功调用返回相同的信号量地址,前提是尚未对此信号量调用 sem_unlink 子例程。
参数
| 项 | 描述 |
|---|---|
| 名称 | 指向用于命名信号量对象的字符串。 |
| oflag | 控制是通过调用 sem_open 子例程来创建还是仅仅访问信号量。 可以在 oflag 参数中设置以下标志位:
|
| 方式 | 指定文件许可权位的值。 与 O_CREAT 配合使用以创建消息队列。 |
| value | 指定初始值。 与 O_CREAT 配合使用以创建消息队列。 |
返回值
成功完成时, sem_open 子例程返回信号量的地址。 否则,它将返回值 SEM_FAILED 并设置 errno 以指示错误。 SEM_FAILED 符号在 semaphore.h 头文件中定义。 sem_open 子例程未成功返回值 SEM_FAILED。
错误代码
| 项 | 描述 |
|---|---|
| EACCES | 指定的信号量存在,并且 oflag 指定的许可权被拒绝。 |
| EEXIST | 设置了 O_CREAT 和 O_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 | 没有足够的空间来创建新的指定信号量。 |