Bill Allombert on Wed, 07 Dec 2005 00:40:34 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: hangling interrupt |
On Mon, Dec 05, 2005 at 04:40:09PM -0500, Igor Schein wrote: > Hi, > > Don't try this in a gp session you care about: > > k=0;while(k++,print(k);system("sleep 1")) > > Now that's what I call a true infinite loop, the one you cannot break > out of. Even ^\ doesn't work, only ^Z and good-bye session. I have a > feeling it's non-trivial to handle this scenario properly. The attached path should fix that provided a suitable has_waitpid.c file is provided, and /bin/sh is a shell. I am not sure it is worth the hassle though... Cheers, Bill. Index: src/gp/gp.c =================================================================== RCS file: /home/cvs/pari/src/gp/gp.c,v retrieving revision 1.279 diff -u -r1.279 gp.c --- src/gp/gp.c 22 Nov 2005 09:23:06 -0000 1.279 +++ src/gp/gp.c 6 Dec 2005 23:37:53 -0000 @@ -24,6 +24,12 @@ #include "gp.h" #include "../graph/rect.h" +#define HAS_WAITPID +#ifdef HAS_WAITPID +# include <unistd.h> +# include <sys/types.h> +# include <sys/wait.h> +#endif #ifdef _WIN32 # include <windows.h> # ifndef WINCE @@ -1698,7 +1704,16 @@ void system0(char *s) { -#if defined(UNIX) || defined(__EMX__) || defined(_WIN32) +#ifdef HAS_WAITPID + pid_t pid; + int status; + check_secure(s); + if (!(pid=fork())) + execl("/bin/sh","sh","-c",s,NULL); + waitpid(pid,&status,0); + if (WIFSIGNALED(status) && WTERMSIG(status)>0) + sigint_fun(); +#elif defined(UNIX) || defined(__EMX__) || defined(_WIN32) check_secure(s); system(s); #else err(archer);