¿Por qué no puedo usar marcos de cacao en diferentes procesos bifurcados?
Estaba jugando con elNSSound
Clase para reproducir un sonido en un proceso de fondo propio para no bloquear la entrada del usuario. Decidí llamarfork()
Pero eso me está dando problemas. En el preciso momento en que se asigna el sonido se bloquea el proceso bifurcado. Lo gracioso es que si construyo un ejemplo que solo llama.fork()
, entonces el proceso hijo puede llamarNSSound
Sin problemas, los bloqueos se producen solo si intento utilizar otras API de cacao.antes de lafork()
llamada. Vea este ejemplo con elcrashme?()
llamadas comentadas:
#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;
}
Cuando ejecuto esto desde la línea de comandos, funciona, pero si descomento una de las llamadas acrashme?()
Las funciones de reproducción en el proceso bifurcado nunca comienzan. ¿Es porque alguna de las API del framework Cocoa no estáseñal asincrónica ¿seguro? ¿Hay alguna manera de hacer que las llamadas de señal asíncrona sean seguras envolviéndolas de alguna manera?