相关疑难解决方法(0)

为什么在Mac OS X上不推荐使用sem_init(),sem_getvalue(),sem_destroy() - 以及取代它们的原因是什么?

当我使用POSIX sem_init()函数编译程序时,我得到一个编译警告(因为我通常使用的错误-Werror),当我在Mac OS X 10.10.1(Yosemite)上使用GCC 4.9.1或版本的版本编译时,该函数已被弃用Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)来自XCode 6.1.1的Clang().快速浏览一下/usr/include/sys/semaphore.h表示此功能确实有__deprecated它的声明之后的标签,因为这样做 sem_getvalue()sem_destroy().

问题:

  1. 鉴于POSIX规范中没有任何弃用的暗示,为什么在Mac OS X上将这三个函数单独列为已弃用?

  2. 鉴于它们已被弃用,替代品是什么,为什么替代品更受欢迎?

(我确实首先检查了Ask Different ;没有标记问题,也没有问题询问已弃用的系统调用 - 只有程序.)

c macos posix

33
推荐指数
1
解决办法
1万
查看次数

Mac OS X上的POSIX信号量:sem_timedwait替代方案

我正在尝试移植一个使用Semaphores到Mac OS X的项目(从linux)但是在Mac OS X上没有实现一些posix信号量

我在这个港口遇到的那个是 sem_timedwait()

我对信号量知之甚少,但是从手册页sem_wait()似乎接近sem_timedwait并且实现了

从手册页

sem_timedwait() function应锁定函数中
semas所引用的信号量sem_wait().但是,如果在
不等待另一个进程或线程
通过执行sem_post() 函数来解锁信号量的情况下无法锁定信号量,则
在指定的超时到期时应终止此等待

从我对semphores如何工作的有限理解,我可以看到sem_timedwait()更安全,但我仍然应该能够使用sem_wait()

它是否正确?如果不是我还有其他选择......

谢谢

unix macos posix semaphore

10
推荐指数
2
解决办法
1万
查看次数

使用Semaphores的程序在Linux上运行良好...在Mac OSX上出现意外结果

我写了一个简单的程序,使用信号量解决了Readers-Writers问题.它在Linux操作系统上完美运行,但是当我在我的Mac OSX上运行时,我得到了意想不到的结果,我无法弄清楚原因.

我的计划:

#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* function1(void* val);
void* function2(void* val);

// shared values
volatile int X;
volatile int Y;

// declare semaphores
sem_t s1;
sem_t s2;

main()
{
void* status;

pthread_t thread1;
pthread_t thread2;
srand(time(NULL));

// initialize semaphores to zero
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);

pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);

pthread_join(thread1, &status);
pthread_join(thread2, &status);

sem_destroy(&s1);
sem_destroy(&s2);

}

void* function1(void* val)
{
   while(1)
   {
   X = rand()%1000; // …
Run Code Online (Sandbox Code Playgroud)

c macos synchronization semaphore

9
推荐指数
1
解决办法
2万
查看次数

如何测试POSIX兼容性?

我正在用POSIX API编写一个C程序并使用Linux.我在朋友的Mac OSX PC上编译并运行它并且出现了一个小错误,但我没有使用Linux特有的功能.

我将使用Linux添加到API的一些特定功能.我还将为Mac Os X和FreeBSD使用特定的POSIX扩展.
我将使用条件编译来选择代码.如果OS不是那些,我将使用通用POSIX代码.

我不拥有Darwin/Mac OSX和FreeBSD,Linux是我在PC上唯一拥有的操作系​​统.我无法下载和安装FreeBSD,因为它超过500 MB.
我想知道一种方法来测试程序是否会在其他POSIX系统上按预期编译和运行.
我想知道是否有POSIX模拟器和编译器来进行测试.
测试很简单,它们不使用GUI和驱动程序,它们只是命令行.

我需要做3个测试:FreeBSD,Mac OSX/Darwin和Generic POSIX,但我没有这些工具.

编辑

有没有GUI的FreeBSD和Darwin的最小版本,但有GCC/G ++和ssh/scp?达尔文是免费的,不是吗?
我的电脑很旧,但我想我可以将它们安装在虚拟机中,创建虚拟网络并使用ssh/scp来传输和测试程序.

c linux testing compatibility posix

4
推荐指数
1
解决办法
1867
查看次数

Mac OS X中的sem_getvalue()功能失调 - C++

我正在尝试通过信号量为Mac OS X中的一堆线程实现共享内存的同步使用.

(我只是忽略了Mac用户在初始化信号量并销毁它时遇到很多问题......可以通过sem_open()和sem_unlink()来修复:D

但显然,为了获得信号量的当前值,除了sem_getvalue()之外什么也没有在mac os x中实现.

对没有运行linux操作系统的人有任何建议,应该在几个小时内上传他的作业??!:)

谢谢

c++ macos semaphore

4
推荐指数
1
解决办法
3692
查看次数

3
推荐指数
2
解决办法
3万
查看次数

C++ Macs OS X semaphore.h:“sem_open()”和“sem_wait()”出现问题

#include <semaphore.h>

sem_t* x;

int main () 
{
    x = sem_open("x", O_CREAT, 0, 0);;
    sem_wait(x); sem_wait(x); sem_wait(x);
    std::cout << "\ndone\n";
}
Run Code Online (Sandbox Code Playgroud)

这段代码甚至不应该通过第一个sem_wait(),但在我的系统上它到达了main(). 我读过的所有内容,例如这里这里,都说,虽然Mac OS X不支持sem_init(),但它确实支持sem_open()。然而,sem_open()按照上面的使用方法并没有解决问题。我运行的是 OS X 10.5.7。

c++ macos semaphore

0
推荐指数
1
解决办法
6644
查看次数

标签 统计

macos ×5

semaphore ×4

c ×3

posix ×3

c++ ×2

compatibility ×1

ios ×1

ios5 ×1

iphone ×1

linux ×1

rounding ×1

synchronization ×1

testing ×1

unix ×1

xcode ×1