使用System V Semaphore API将semaphore支持从标准POSIX API平台向外扩展

在将代码移植到 z/OS 平台时,您会面临的一个重要挑战是 POSIX semaphore API 在 z/OS 上的可用性。通常,在 Linux®/UNIX/Windows® 平台上运行的很多程序都是用 POSIX semaphore 开发的。

这个问题的一个解决方案是使用 System V API 代替 POSIX API 来实现 z/OS。这会涉及到整个代码中大量的代码更改,以及大量的编写和测试工作。另一个更好的解决方案是使用可用的 System V API 在 z/OS 中实现 POSIX API。如果采用这种方法,移植所需的代码更改会很少。这些代码更改不包含在应用程序代码中,而是作为单独的 semaphore 标头和 C 文件包含在内。此标头和 C 文件是通用的,可用于任何平台。

本文阐释了如何使用 System V Semaphore API 来实现 POSIX Semaphore API。

本文对于想要使用 POSIX API 但开发平台只支持 System V API(比如 z/OS)的">开发人员会非常有帮助。而且本文还会从开发角度对 POSIX 和 System V semaphore 进行显著的区分。

对比 POSIX Semaphore 和 System V Semaphore

Semaphore 可以有两种类型:POSIX Semaphore 或 System V semaphore。

您可以在 semaphores 上以单独的单元或以集合中的元素进行操作。由于 System V IPC semaphores 可以位于一个巨大的数组中,所以它们是属于极其重量级的。Semaphore 集合由一个控制结构和一个 semaphore 数组组成。一组 semaphore 可以包括最多 25 个元素。System V IPC semaphore 函数包括 semget()、semop() 和 semctl()。

semget() - 创建一个
新的 semaphore 集或使用 semget() 系统调用访问一个现有集合。 semop() - 执行 semaphore 操作。 semctl() - 如果您是该 semaphore 的创作者,
那么可以更改它的所有权或许可权限。

POSIX semaphore 要比 System V semaphore 轻很多。POSIX semaphore 结构定义了一个单一的 semaphore,而不是一个 semaphore 数组。POSIX semaphore 函数包括:

sem_open() - 连接到(也可以根据情况创建)一个命名的 semaphore sem_init() - 初始化一个 semaphore 结构(属于调用程序内部的结构,所以不是一个命名的 semaphore) sem_close() - 终止一个打开的 semaphore 的连接 sem_unlink() - 终止一个打开的 semaphore 的连接并在最后的进程关闭该连接时删除此 semaphore sem_destroy() - 初始化一个 semaphore 结构(属于调用程序内部的结构,所以不是一个命名的 semaphore) sem_getvalue() - 将 semaphore 的值复制到指定的整数 sem_wait() 和 sem_trywait() - 当 semaphore 由其他进程持有时会发生阻塞,或是如果 semaphore 由另一个进程持有,则返回一个错误 sem_post() - 增加 semaphore 的数目

POSIX 自带了创建、初始化和在 semaphore 上执行操作所对应的简单语义。这些语义提供了一种处理进程间通信的有效方式。如果您需要在单个步骤内执行多次增量-减量来实现原子操作,那么 System V semaphore 会非常有用。除此之外,请尽量使用 POSIX semaphore。

Semaphore 在 z/OS 上的限制

z/OS 只支持 System V Semaphore,不支持 POSIX semaphore。

在 z/OS 上没有可用的 POSIX API。z/OS 只有三个面向 semaphore 的 System V API,分别为 semop()、semget() 和 semctl()。如果想要在 z/OS 内使用 semaphore API,那么只能使用 System V API。

表 1. 不同平台上的 Semaphore 支持

Linux AIX® zLinux HP
Solaris Mac OS z/OS POSIX Y Y Y Y Y Y N System V Y Y Y Y Y Y Y

使用 System V Semaphore API 实现 POSIX Semaphore API

所有 POSIX semaphore 函数和类型都是在 semaphore.h 内原型化或定义的。在某些遗留平台(比如 z/OS)上,只有 System V semaphore 函数可用。因此,semaphore.h(用以定义 POSIX Semaphore 函数)在 z/OS 上是不可用的。System V semaphore 函数在 sys/sem.h 内原型化。

时间: 2024-10-10 18:59:24

使用System V Semaphore API将semaphore支持从标准POSIX API平台向外扩展的相关文章

如何使用System V Semaphores API实现POSIX Semaphore API

概述 在将代码移植到 z/OS 平台时,您会面临的一个重要挑战是 POSIX semaphore API 在 z/OS 上的可用性. 通常,在 Linux/UNIX/Windows 平台上运行的很多程序都是用 POSIX semaphore 开发的. 这个问题的一个解决方案 是使用 System V API 代替 POSIX API 来实现 z/OS.这会涉及到整个代码中大量的代码更改,以及大量的编写和测试工作 .另一个更好的解决方案是使用可用的 System V API 在 z/OS 中实现

glibc库详解及与POSIX,system V这些库之间关系的说明

自己想了解下关于system v,在网上看到一篇详细的说明,与大家分享一下,原文地址http://hi.baidu.com/tekuba/item/570887775696542e5c178918        以前对glibc,POSIX等的关系一直很迷惑.这是今天在网上找到的说明glibc,POSIX,system V关系的一篇不错的文章,虽然有些地方不通顺(大概是直接用机器翻译过来的),但大概意思能明白了.通过下面的说明,我们就可以明白linux应用层的层次构造.关键是glibc,他是li

UNIX环境高级编程:system V信号量

1. 信号量(semaphore)主要用于保护临界资源. 进程可以根据它判断是否能访问某些共享资源. 信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信. 2. 信号量分类: a. 二值信号量: 信号量的值只能取0或1,类似于互斥锁mutex,但两者又不同: mutex 与 二值信号量的区别: 信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值: 互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来接锁. b. 计数信号量:信号量的值可以取任意非负值. sy

System V 信号量

System V 信号量在内核中维护,其中包括二值信号量 .计数信号量.计数信号量集. 二值信号量 : 其值只有0.1 两种选择,0表示资源被锁,1表示资源可用: 计数信号量:其值在0 和某个限定值之间,不限定资源数只在0 1 之间: 计数信号量集 :多个信号量的集合组成信号量集 内核维护的信号量集结构信息如下:定义在头文件<sys/sem.h> struct semid_ds { struct ipc_perm sem_perm; struct sem *sem_base; ushort s

System V 消息队列

1.概述 消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.System V 消息队列是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除.可以将内核中的某个特定的消息队列画为一个消息链表,如下图所示: 对于系统中没个消息队列,内核维护一个msqid

Slackware启动脚本与System V启动脚本的区别

Slackware版本:Slackware 7.0及以上 Slackware 使用BSD风格的init脚本,而很多别的发行版使用System V风格的init脚本.SysV和BSD脚本都是能让人读懂的,即它们都是shell脚本,而不是已编译的程序.主要的区别在于脚本是如何设计的. SysV脚本倾向于接受诸如start.stop.restart之类的参数,依它所启动的程序而定.所以你可以用 /etc/init.d/bind start 这样的命令来启动BIND,并用 /etc/init.d/bin

System V 共享内存区

1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件.执行过程是先调用shmget,再调用shmat.对于每个共享的内存区,内核维护如下的信息结构,定义在<sys/shm.h>头文件中. 1 struct shmid_ds { 2 struct ipc_perm shm_perm; /* operation perms */ 3 int shm_

神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性

谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快. 过去的五个月里, Kotlin一直是我们反复谈论的重点.现在要告诉大家的是,Android Studio 3.0可以将Kotlin添加到您的项目中了.最新版本的Android Studio在支持Java 8语言功能上得到了改进,另外一个亮点是,有了用于Gradle 3.0.0的Android插件. 好,下面步入正文. 曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月

UNIX环境高级编程:system V消息队列

unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消息看作一个记录,具有特定的格式. 进程可以按照一定的规则向消息队列中添加新消息:另一些进程可以从消息队列中读走消息. 消息队列是随内核持续的,只有内核重启或人工删除时,该消息队列才会被删除. system V消息队列使用消息队列标识符标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以