View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

Usar señales desde programas Motif (p.ej. cambiar cosas en el UI cuando obtienes un SIGUSR1, SIGCHLD, SIGALRM, etc).

Lectura recomendada: http://www.ist.co.uk/motif/books/vol6A/ch-26.fm.html

Para usar señales desde programas motif, hay que tener cuidado de no tocar el UI desde el propio manejador de señales, sino que hay que notificarlo al Motif y que éste llame a una rutina de atención cuando ya sea seguro el llamar a las rutinas de las X.

NOTA: Cuando se hace sin las X, hay un sistema similar; se hace un mkpipe, cuyo fd de lectura se mete en el select principal del programa. En la rutina de la señal, simplemente se hace un write de un carácter en el fd de escritura del pipe. El select detectará que el pipe tiene datos y entonces sólo hay que leer el caracter y después hacer el procesamiento que no podías hacer dentro del manejador de señal (esto funciona porque hacer un read() o un write() sí es válido dentro de un manejador de señal; es un requerimiento de UNIX).

#include <signal.h>

/* Variable globales */
XtSignalId IdSigusr1=0;
static void sigusr1(int Num);
int instala_senial(int Num,void (*f)(int));

main()
{
   //...
   IdSigusr1=XtAppAddSignal(app_context,ProcSigusr1,UserPtr);
   //...
   instala_senial(SIGUSR1,sigusr1);
}

static void
sigusr1(int Num)
{
   fprintf(stderr,"sigusr1(): LLegada de senal SIGUSR1.\n"),fflush(stderr);
   XtNoticeSignal(IdSigusr1);
}


int
instala_senial(int Num,void (*f)(int))
{
   struct sigaction sact;
   sact.sa_handler=f;
   sigemptyset(&sact.sa_mask);
   sact.sa_flags=0;
   return(sigaction(Num,&sact,0));
}

void
ProcSigusr1(XtPointer ClientData, XtSignalId *Id)
{
   /* ProcSigusr1(): Procesamiento diferido de SIGUSR1 */
   char *UserPtr
   UserPtr=(char *)ClientData;
   // ...
   return;
}