Francois.Bitz@SAM.CS.CMU.EDU (08/30/89)
I am posting this since I got quite a few requests
to send back what I found about how to interrupt
a process...
The solution which works fine (for me) is to do the following:
Write a simple program that starts up the main
X application and then pop-ups a one button menu...
which when pressed will send a SIGINT interrupt to
the application. Note that in some Unix operating systems
there are 1-2 USER definable (SIGUSER1,..) that could be
used instead of SIGINT; but this is less portable
than SIGINT. Below are the listings of a simple program
to test this. The flag ENB_INTR can be set to 0 when
executing critical sections (where no interrupts are
desired); setjmp(int_catch) can be written anywhere
where we want the program to 'jump' when interrupts
occur (usually at the top of an application loop).
These have worked for me on Unix Sys V and 4.3 bsd.
/******************** PROGRAM #1 **********************/
/* THIS starts up X application */
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
int pid=0;
main()
{
pid = fork();
if (pid == -1) {
printf("error in fork()\n");
}
if (pid ==0) { /* we are in child process now */
/* printf("in child process \n"); */
execl("application",0);
exit(1);
}
/* we are in parent process here */
/* could pop-up a small widget now ... .*/
/* when button pressed then we execute */
/* kill(pid,SIGINT); */
/* or could write the following for test:*/
while(1) {
/* check event for pressed key.... */
/* if pressed button */
/* NOTE: getchar is here just for test */
/* could be replaced with checking events.... */
getchar();
kill(pid,SIGINT);
}
}
/******************** PROGRAM #2 **********************/
/* application.c */
/* THIS is X application */
#include <signal.h>
#include <setjmp.h>
jmp_buf int_catch;
int ENB_INTR=0;
void handle_int()
{
if (ENB_INTR) { longjmp(int_catch); }
else { /* nothing happens */ }
}
main()
{
signal(SIGINT,handle_int);
setjmp(int_catch); /* where to jump back after inter. */
ENB_INTR=1;
while(1) {
/* do application stuff */
}
}