sem_open() posix函数在macOS命令行测试代码上成功,但在macOS应用程序测试代码上失败。它返回0xffff....和errno=1(EPERM)或17(EEXIST)。我在命令行和应用程序上运行与附加相同的代码。我使用Xcode生成的功能设置和Info.plist。
命令行代码: works
//  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 :失败
#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
发布于 2021-04-24 03:36:21
在你失败案例的更大环境中,有些东西是不同的。
当sem_open失败时,它返回SEM_FAILED -在您的系统上可能是(sem_t *)-1 - errno值将告诉您哪里出了问题:
EEXIST -已命名的信号量已经存在,但您要求独占(O_EXCL)创建(O_CREAT)使用该名称的新信号量。EPERM -您的进程没有打开信号量的权限。
后一个错误代码没有记录在我能找到的OS X手册页中,但是一些(BSD)系统会在所有者权限干扰操作时设置该错误。
https://stackoverflow.com/questions/67235670
复制相似问题