- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我使用 POSIX sem_init()
编译程序时函数,我收到编译警告(错误,因为我通常使用 -Werror
)当我在 Mac OS X 10.10.1 (Yosemite) 上使用 GCC 4.9.1 或以下版本编译时,该函数已被弃用来自 XCode 6.1.1 的 Clang(Apple LLVM 版本 6.0 (clang-600.0.56)(基于 LLVM 3.5svn)
)。快速查看 /usr/include/sys/semaphore.h
可以看出该函数在其声明后确实有一个 __deprecated
标记,正如 sem_getvalue()
和 sem_destroy()
.
问题:
鉴于 POSIX 规范中没有弃用的提示,为什么这三个函数在 Mac OS X 上被单独列为弃用?
鉴于它们已被弃用,替代品是什么,为什么首选替代品?
(我首先检查了 Ask Different;没有标记为 c 的问题,也没有关于已弃用系统调用的问题 — 只有程序。)
最佳答案
我在尝试将我正在处理的库移植到 OS X 时遇到了这个问题。我搜索了一段时间,但没有找到很好的答案。当我确实找到答案时,我有点不安:答案实际上是 "if Apple implemented POSIX unnamed semaphores, how many X Serves would you buy?" .
总结它们被弃用的原因以及某些功能仍未实现的原因:
sem_t
类型的 POSIX 命名信号量向后兼容很困难至于该怎么做,我选择了 GCD 信号量。至于为什么首选替代品:它是 vanilla OS X 上唯一可用的 native 未命名信号量接口(interface)。显然 GCD 帮助他们销售了更多的 X 服务。恐怕没有更好的答案了。
但是,希望一些代码会有所帮助。所有这一切的结果是您实际上必须实现自己的可移植信号量接口(interface):
#ifdef __APPLE__
#include <dispatch/dispatch.h>
#else
#include <semaphore.h>
#endif
struct rk_sema {
#ifdef __APPLE__
dispatch_semaphore_t sem;
#else
sem_t sem;
#endif
};
static inline void
rk_sema_init(struct rk_sema *s, uint32_t value)
{
#ifdef __APPLE__
dispatch_semaphore_t *sem = &s->sem;
*sem = dispatch_semaphore_create(value);
#else
sem_init(&s->sem, 0, value);
#endif
}
static inline void
rk_sema_wait(struct rk_sema *s)
{
#ifdef __APPLE__
dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER);
#else
int r;
do {
r = sem_wait(&s->sem);
} while (r == -1 && errno == EINTR);
#endif
}
static inline void
rk_sema_post(struct rk_sema *s)
{
#ifdef __APPLE__
dispatch_semaphore_signal(s->sem);
#else
sem_post(&s->sem);
#endif
}
这是我关心的最小功能集;您的需求可能会有所不同。希望这对您有所帮助。
关于c - 为什么 sem_init()、sem_getvalue()、sem_destroy() 在 Mac OS X 上被弃用了——什么替代了它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736618/
if((sem_init(sem, 1, 1)) == 1) perror("error initiating sem"); 如果我包含这行代码,我的程序就会启动并退出。我刚刚开始学习如何使用信号量。
任务是模拟仓库的工作。生产者(数量为 argv[2])创建随机数量的“商品”(总数量为 argv[1]),消费者(数量为 argv[3])获得这些商品的随机数量。完整代码如下。我遇到段错误并尝试调试它
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
在一个类中,我们不得不使用信号量来完成线程工作。 sem_init 的原型(prototype)(和头文件)如下: int sem_init(sem_t *sem, int pshared, unsi
在研究生类(class)中,我们不得不使用信号量来完成线程工作。 我们被指示使用 sem_init以及一堆其他 sem_* 过程,但我们没有得到关于每个 sem_* 方法的详细信息的太多信息。 sem
sem_init() 的手册页说“初始化已经初始化的信号量会导致未定义的行为。”为什么会这样?在 Linux 上究竟会发生什么? 这对我来说没有意义,因为当您第一次调用 sem_init() 时,(未
在 Linux (2.6.27) 上,当我调用 sem_init() 来初始化共享内存中的未命名信号量时,该信号量是纯用户空间的还是由 Linux 内核控制的? 如果持有这个信号量的进程死掉了,这个信
我正在编写一些使用 pthread 和信号量库的代码。 sem_init 函数在我的 Ubuntu 机器上运行良好,但在 OS X 上 sem_init 函数完全没有效果。图书馆有问题还是有不同的方法
我正在考虑更改一些我想在 linux、unix 和 OSX 上运行的代码。代码中有一些调用 sem_init,但 pshared 值设置为零。我读了一些关于 unix 编程的 Rochkind 书,他
sema_init 和 sem_init 有什么区别?各个API是否有特定的使用场景和其他依赖关系? 最佳答案 因为你用“linux”标记了它,我将忽略其他 Unix。 sema_init是Linux
考虑下面给出的代码片段: #include #include sem_t empty; sem_t full; sem_t mutex; int m
我目前遇到了一个问题。 下面是原代码 sem_t s; sem_init(&s, 0, 1); 我需要将 sem_init 替换为 sem_open,因为它将在 iOS 上使用 sem_t s; se
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我正在编写一些使用 pthread 和信号量库的代码。这是我的代码,但它不起作用,我认为这是因为 sem_init 函数。我是 C 新手,真的不知道如何使用 sem_init、sem_open、sem
这是我在 linux 中用 c 语言编写读写器问题的代码。我之前看到了一些相同的问题,解决它们的方法是使用 -lpthread 或 -ltr,我分别和一起尝试了这两个问题,但我仍然不断遇到相同的错误。
我是共享内存的初学者,我实现了一个并行加法器,其中 k 个处理器中的每一个都作为子进程实现。具体来说,给定一组 n 个整数和 k 的值,主程序创建 k 个子进程,分配每个子进程计算其分配的 n/k 个
使用信号量和 POSIX 线程进行操作系统编程作业。这是我的代码: #include #include sem_t mutex, to_b, to_a; int main() { // I
我试图在我拥有的一段Python代码中锁定多个变量,每个变量一个锁。使用 semaphore.h 中提供的 sem_wait、sem_post、sem_init 例程可以轻松地在 C 语言中锁定变量。
当我使用 POSIX sem_init() 编译程序时函数,我收到编译警告(错误,因为我通常使用 -Werror)当我在 Mac OS X 10.10.1 (Yosemite) 上使用 GCC 4.9
我是一名优秀的程序员,十分优秀!