【发布时间】:2015-02-28 10:59:20
【问题描述】:
当我使用 POSIX sem_init() 函数编译程序时,我收到一个编译警告(错误,因为我通常使用 -Werror),当我在 Mac OS X 10.10.1 (Yosemite) 上编译时,该函数已被弃用使用 GCC 4.9.1 或 XCode 6.1.1 中的 Clang (Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)) 版本。快速查看/usr/include/sys/semaphore.h 表明该函数在其声明后确实有一个__deprecated 标记,就像这样
sem_getvalue() 和
sem_destroy().
问题:
鉴于 POSIX 规范中没有暗示要弃用,为什么这三个函数在 Mac OS X 上被单独列出为弃用?
鉴于它们已被弃用,替代品是什么,为什么首选替代品?
(我确实首先检查了Ask Different;没有标记为c 的问题,也没有关于已弃用系统调用的问题——只有程序。)
【问题讨论】:
-
@IskarJarak:这两个中的第一个似乎在实践中涵盖了我的问题,尽管仍有“为什么”(如“为什么 Mac OS X 不支持未命名的信号量?)”未解决。但这可能是最不容易回答的部分。由于我的代码没有编译,所以我没有从
sem_init()函数得到 ENOSYS 错误。 -
另一个或许更规范的答案来源可以通过“Mac 开发”的“核心操作系统”小节中的devforums.apple.com 找到。
-
@JonathanLeffler,在进程之间的共享内存中实现控制结构在开发和执行中都是相当大的开销。他们可能只是不想为在线程世界中没有太多用处的接口招致这种情况。他们处理这个问题的方式实际上很烦人,提供了一个只返回错误的界面。这再次表明,他们对 POSIX 的坚持只是表面上的。他们并没有真正致力于提供一个开放的环境。