Warum kann ich Kakao-Frameworks nicht in unterschiedlichen Gabelprozessen verwenden?
Ich habe mit dem gespieltNSSound
Klasse, um einen Sound in einem eigenen Hintergrundprozess abzuspielen, um Benutzereingaben nicht zu blockieren. Ich beschloss anzurufenfork()
aber das gibt mir probleme. In dem Moment, in dem der Sound zugeordnet ist, stürzt der gegabelte Prozess ab. Das Lustige ist, wenn ich ein Beispiel konstruiere, das nur aufruftfork()
, dann kann der untergeordnete Prozess aufrufenNSSound
ohne probleme kommen die abstürze nur wenn ich versuche andere cocoa APIs zu verwendenVor dasfork()
Anruf. Siehe dieses Beispiel mit demcrashme?()
Anrufe kommentiert:
#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;
}
Wenn ich das von der Kommandozeile aus starte, funktioniert es, aber wenn ich einen der Aufrufe von einem der beiden auskommentierecrashme?()
funktionen die wiedergabe im gegabelten prozess startet nie. Liegt es daran, dass es keine der Cocoa Framework APIs gibtAsynchronsignal sicher? Gibt es eine Möglichkeit, das asynchrone Signal der Anrufe sicher zu machen, indem Sie sie irgendwie verpacken?