[Scilab-Dev] Catch a CTRL+C

steer Serge.Steer at scilab.org
Thu Nov 20 19:30:21 CET 2008


Your proposal seems to me  a good idea.
Note however that if you want to cancel the execution of a C code you
will have to generate a Scilab error to clean the calling environnement,
so it is not ok to call the (*old_handler)(sig); but you need to reset
the default controlC_handler...

Serge Steer

Collette Yann a écrit :
> Hello,
>
> Thanks to Serge answer.
> The variable C2F(basbrk).iflag is not visible in scilab. Impossible to
> link a program with such a symbol.
> But I managed to find a function in the core module:
> csignal.[ch]. This function defines a handler to deal with SIGINT.
> I was wondering if it was possible to extend this function so as to a
> user defined handler before the scilab one.
>
> Something like this:
>
> csignal.c:
> #include "banier.h"
> #include "csignal.h"
> #include "sigbas.h"
>
> extern int C2F(sigbas)();
>
> typedef void (*sig_func_t)(int);
>
> void controlC_handler (int);
>
> static user_controlC_handler = controlC_handler;
>
> void set_controlC_handler (sig_func_t myHandler)
> {
>  user_controlC_handler = myHandler;
> }
>
> sig_func_t get_controlC_handler ()
> {
>  return user_controlC_handler;
> }
>
> void controlC_handler (int sig)
> {
>  int j = SIGINT;
>  C2F(sigbas)(&j);
> }
>
> int C2F(csignal)(void)
> {
>  signal (SIGINT, user_controlC_handler);
>  return(0);
> }
>
>
> csignal.h:
> #ifndef __CSIGNAL_H__
> #define __CSIGNAL_H__
> #include <signal.h>
> #include "machine.h"
>
> void controlC_handler (int sig);
>
> typedef void (*sig_func_t)(int);
>
> void set_usercontrolC_handler(sig_func_t handler);
> sig_func_t get_controlC_handler ();
>
> int C2F(csignal)(void);
>
> #endif /* __CSIGNAL_H__ */
>
>
> With such functions, to add a new SIGINT handler is easier:
>
> sig_func_t old_handler = get_controlC_handler();
>
> void my_controlC_handler(int sig)
> {
>  // Do something to close cleanly the C interface
>  // Now call the scilab handler
>  (*old_handler)(sig);
> }
>
> set_controlC_handler(my_controlC_handler);
>
> I am open to suggestions ...
> Can I commit these changes ?
>
> YC
> steer a écrit :
>> ycollet at freesurf.fr a écrit :
>>  
>>> Hello,
>>>
>>> Is it possible to catch a CTRL+C (entered in the scilab shell) in a C
>>> interface ?
>>> I have a C interface which takes a lot of time to execute and I want
>>> to interrupt this C interface while I am fine tuning some algorithms.
>>>
>>> YC
>>>
>>>
>>>
>>>
>>>     
>> Le Ctrl-C est trappé par Scilab qui assigne true a la variable
>> C2F(basbrk).iflag
>> Il suffit donc de tester cette valeur et ne pas oublier de la remettre a
>> false une fois prise en compte
>>
>> Serge
>>
>>   
>
>




More information about the dev mailing list