sem.h 文件

用途

描述了执行信标操作的子例程所使用的结构。

描述

/usr/include/sys/sem.h 文件定义 se拖把 子例程和 semctl 子例程用于执行各种信号操作的结构。

塞姆 结构存储了 塞姆茨特尔 子例程的 命令 参数所获取和设置的值。 该结构包含以下字段:

描述
semval 指定信号量的操作权限结构。 此字段的数据类型为无符号短格式。
sempid 指定执行 塞地布 子例程的最后一个进程。 此字段的数据类型为 pid_t。
semncnt 指定等待的进程数semval > cval。 此字段的数据类型为无符号短格式。
semzcnt 指定等待的进程数semval= 0. 此字段的数据类型为无符号短格式。

森布夫 结构存储 塞地布 子例程所使用的信号量信息。 该结构包含以下字段:

sem_num
指定要对其执行某些信号量操作的信号量。 此字段的数据类型为无符号短格式。
sem_op
指定要对由以下项指定的信号量执行的信号量操作:sem_num字段和 se拖把 子例程的 SemaphoreID 参数。 此值可以是正整数,负整数或者 0:
如果当前进程具有写许可权,那么会将此字段的正整数值添加至semval信号量的字段。
-
如果当前进程具有写许可权,那么此字段中的负整数值将导致下列其中一项操作:

如果semval 字段大于或等于以下值的绝对值:sem_op字段,该字段的绝对值sem_op从该字段的值中减去semval

如果semval字段小于以下值的绝对值:sem_op字段,且 IPC_NOWAIT 标志被设置,则 semop 子程序返回 -1 ,并将 errno 全局变量设置为 EAGAIN

如果该值为semval字段小于以下值的绝对值:sem_op并且未设置 IPC_NOWAIT 标志,那么 塞地布 子例程将使semncnt与指定信号量关联的字段,并暂挂调用进程的执行,直到满足下列其中一个条件:

  • 以下项的值:semval字段变为大于或等于该字段的绝对值sem_op。 在发生此情况时,semncnt与指定的信号量关联的维尔德是递减的,该值是sem_op从字段中减去semval并且,如果在 SEM_UNDO 标志中设置了sem_flg字段,该字段的绝对值sem_op字段将添加到指定信号量的调用进程的 塞马季 值中。
  • 将从系统中除去由 SemaphoreID 参数指定的信号量 (调用进程正在等待操作) (请参阅 semctl 子例程)。 出现这种情况时, errno 全局变量将被设置为等于 EIDRM ,并返回 -1 的值。
  • 呼叫进程接收到一个要捕获的信号。 在发生此情况时,semncnt与指定的信号量相关的字段被递减,并且调用进程以 签名 子例程中规定的方式恢复执行。
0
如果当前进程具有读许可权,那么此字段中的值 0 将导致下列其中一项操作:
  • 如果semval字段为 0 , 塞地布 子例程返回值 0。
  • 如果semval字段不等于 0 且设置了 IPC_NOWAIT 标志时, semop 子程序将返回 -1 ,并将 errno 全局变量设置为 EAGAIN
  • 如果semval0 等于 0 ,并且未设置 IPC_NOWAIT 标志,那么 塞地布 子例程将使semzcnt与指定信号量关联的字段,并暂挂调用进程的执行,直到满足下列其中一个条件:
    • 以下项的值:semval字段变为 0 ,此时该字段的值semzcnt与指定信号量关联的字段将被递减。
    • 将从系统中除去调用进程正在等待操作的 SemaphoreID 参数指定的信号量。 出现这种情况时, errno 全局变量将被设置为等于 EIDRM ,并返回 -1 的值。
    • 呼叫进程接收到一个要捕获的信号。 在发生此情况时,semzcnt与指定的信号量相关的字段被递减,并且调用进程以 签名 子例程中规定的方式恢复执行。

以下项的数据类型:sem_op字段很短。

sem_flg
如果对于某个操作,此字段的值不是 0 ,那么通过对下列一个或多个值进行逻辑 OR 运算来构造该值:
SEM_UNDO
指定是否对调用过程的 塞马季 值进行修改。

如果为某个操作设置了此值,并且该值sem_op字段为正整数,那么值为sem_op字段将从调用过程的 塞马季 值中减去。

如果为某个操作设置了此值,并且该值sem_op字段为负整数,其绝对值为sem_op字段将添加到调用过程的 塞马季 值。 退出 子例程将 塞马季 值添加到以下项的值:semval进程终止时的信号量的字段。

SEM_ORDER
指定是自动执行还是单独执行由 se拖把 子例程的 SemaphoreOperations 数组指定的操作。 (只有在 SemaphoreOperations [0].sem_flg 参数(即数组中的第一个操作)中包含该标志时,该标志才有效)。 SemaphoreOperations 数组中的第一个操作)

如果未设置 SEM_ORDER 标志 (缺省值) ,那么将以原子方式执行指定的操作。 也就是说没有任何一个semval将修改阵列中的值,直到完成所有信号量操作为止。 如果调用进程必须等到某个时间semval满足要求, 塞地布 子例程在执行任何操作之前执行此操作。 如果任何信号量操作都将导致发生错误,那么将不会执行任何操作。

如果设置了 SEM_ORDER 标志,那么将按操作在阵列中出现的顺序单独执行这些操作,而不考虑是否有任何操作需要等待进程。 If an operation encounters an error condition, the 塞地布 subroutine sets the SEM_ERR flag in thesem_flg失败操作的字段; 不执行失败操作,也不执行阵列中的以下操作。

IPC_NOWAIT
指定在发生以下情况时是等待还是立即返回:semval信号量的值不是一定值。

以下项的数据类型:sem_flg字段很短。

塞米德兹 结构存储由 塞姆茨特尔 子例程使用并由 缓冲区 参数指向的信号量状态信息。 该结构包含以下字段:

描述
sem_perm 指定信号量的操作权限结构。 此字段的数据类型为 struct ipc_perm
sem_nsems 指定集合中的信号量的数量。 此字段的数据类型为无符号短格式。
sem_otime 指定 塞地布 子例程最近一次执行的时间。 此字段的数据类型为 时间 (_T)
sem_ctime 指定最近一次使用 塞姆茨特尔 子例程更改此结构的时间。 此字段的数据类型为 时间 (_T)