Почему я не могу использовать каркасы какао в разных разветвленных процессах?
Я играл с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 Какао неАсинхры-сигнал безопасный? Есть ли способ сделать вызов асинхронным сигналом безопасным, обернув их как-то?