Jeroen Demeyer on Mon, 18 Apr 2005 13:41:11 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: GP handling of SIGINT (Linux)


Karim Belabas wrote:
* Jeroen Demeyer [2005-04-17 21:35]:

Hello list,

while hacking with GP and shell scripts under Linux, I noted the following:

When using GP non-interactively (gp -f -q <commands.gp >output),
it only handles a SIGINT once. The first SIGINT is caught and interrupts the current command (as usual), but any further SIGINTs do nothing. I don't understand how come this behaviour is different from an interactive GP, where multiple SIGINTs can be cought.

Is this a feature or a bug?


It's a bug, which we've not been able to trace so far. See

Looking at the code, I have an idea on what's going wrong. The problem seems to be with the use of longjmp(). This causes the function gp_sighandler() never to return, so the rest of the program is treated as being inside the signal handler. By default a signal can never occur during a signal handler.

A very ugly hack around this is to change this default. I have done this in attached patch. I can only say it fixes my problem, but it could very well break things. The behaviour is also likely to be OS-dependent.
? build.sh
? config/linux-i686-tmp19989
Index: src/language/es.c
===================================================================
RCS file: /home/cvs/pari/src/language/es.c,v
retrieving revision 1.168
diff -u -r1.168 es.c
--- src/language/es.c	6 Apr 2005 19:43:13 -0000	1.168
+++ src/language/es.c	18 Apr 2005 11:31:22 -0000
@@ -2741,7 +2741,15 @@
 #ifdef WINCE
   return SIG_IGN;
 #else
-  return signal(sig,f);
+  struct sigaction sa;
+  struct sigaction oldsa;
+  
+  sa.sa_handler = f;
+  sigemptyset(&sa.sa_mask);
+  sa.sa_flags = SA_NODEFER;
+  
+  if (sigaction(sig, &sa, &oldsa)) return NULL;
+  return oldsa.sa_handler;
 #endif
 }