首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sem_open()在命令行上macOS成功,在应用程序上失败

sem_open()在命令行上macOS成功,在应用程序上失败
EN

Stack Overflow用户
提问于 2021-04-24 03:12:12
回答 1查看 76关注 0票数 0

sem_open() posix函数在macOS命令行测试代码上成功,但在macOS应用程序测试代码上失败。它返回0xffff....和errno=1(EPERM)或17(EEXIST)。我在命令行和应用程序上运行与附加相同的代码。我使用Xcode生成的功能设置和Info.plist。

命令行代码: works

代码语言:javascript
运行
复制
//  main.m
#import <Foundation/Foundation.h>
#include <semaphore.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        sem_unlink("pSem");
        errno = 0;
        sem_t *sem = sem_open ("pSem", O_CREAT | O_EXCL, 0777, 1);
        fprintf (stderr, "sem=%p errno=%d\n\n", sem, errno); // sem=0x03 errno=0
    }
    return 0;
}

应用程序代码的ViewController.m :失败

代码语言:javascript
运行
复制
#import "ViewController.h"
#include <semaphore.h>
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    sem_unlink("pSem2");
    errno = 0;
    sem_t *sem = sem_open ("pSem2", O_CREAT | O_EXCL, 0777, 1);
    fprintf (stderr, "sem=%p errno=%d\n\n", sem, errno); //sem=0xff...ff errno=1 or 17 
}
@end

我使用macOS Big Sur 11.2.3,Xcode12.4

EN

回答 1

Stack Overflow用户

发布于 2021-04-24 03:36:21

在你失败案例的更大环境中,有些东西是不同的。

sem_open失败时,它返回SEM_FAILED -在您的系统上可能是(sem_t *)-1 - errno值将告诉您哪里出了问题:

EEXIST -已命名的信号量已经存在,但您要求独占(O_EXCL)创建(O_CREAT)使用该名称的新信号量。EPERM -您的进程没有打开信号量的权限。

后一个错误代码没有记录在我能找到的OS X手册页中,但是一些(BSD)系统会在所有者权限干扰操作时设置该错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67235670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档