Почему я не могу использовать каркасы какао в разных разветвленных процессах?

Я играл сNSSound класс для воспроизведения звука в фоновом процессе самостоятельно, чтобы не блокировать ввод пользователя. Я решил позвонитьfork() но это доставляет мне проблемы. В тот самый момент, когда выделяется звук, происходит сбой разветвленного процесса. Самое смешное, если я создам пример, который вызывает толькоfork()тогда дочерний процесс может вызватьNSSound без проблем, сбои происходят, только если я пытаюсь использовать другие API какаодо fork()вызов. Посмотрите этот пример сcrashme?() звонки прокомментированы:

#import <AppKit/AppKit.h>
#import <math.h>

#define FILENAME \
    "/System/Library/Components/CoreAudio.component/" \
    "Contents/SharedSupport/SystemSounds/dock/drag to trash.aif"

void crashme1(void)
{
    NSString *path = [[NSString alloc] initWithUTF8String:"false file"];
    NSSound *sound = [[NSSound alloc]
        initWithContentsOfFile:path byReference:YES];
}

void crashme2(void)
{
    NSInteger tag = 0;
    [[NSWorkspace sharedWorkspace]
        performFileOperation:NSWorkspaceRecycleOperation
        source:@"." destination:nil
        files:[NSArray arrayWithObject:@"false file"] tag:&tag];
}

double playAif(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *path = [[NSString alloc] initWithUTF8String:FILENAME];
    NSSound *sound = [[NSSound alloc]
        initWithContentsOfFile:path byReference:YES];
    [path release];

    if (!sound) {
        [pool release];
        return -1;
    }

    const double ret = [sound duration];
    [sound play];
    [sound autorelease];
    [pool release];
    return ret;
}

int main(int argc, char *argv[])
{
    //crashme1();
    //crashme2();
    int childpid = fork();
    if (0 == childpid)  {
        printf("Starting playback\n");
        double wait = playAif();
        sleep(ceil(wait));
        wait = playAif();
        sleep(ceil(wait));
        printf("Finished playback\n");
    }
    return 0;
}

Когда я запускаю это из командной строки, это работает, но если я раскомментирую один из вызовов либоcrashme?() функции воспроизведения в раздвоенном процессе никогда не начинается. Это потому, что ни один из интерфейсов API Какао неАсинхры-сигнал безопасный? Есть ли способ сделать вызов асинхронным сигналом безопасным, обернув их как-то?

Ответы на вопрос(1)

Ваш ответ на вопрос