[erlang-questions] signal handler

Rick Pettit rpettit@REDACTED
Tue Jun 5 18:14:50 CEST 2007


On Tue, Jun 05, 2007 at 10:27:29AM +0530, Saifi Khan wrote:
> Hi:
> 
> How does one write a signal handler in erlang ?

I'm not sure anyone does or even can (i.e. without spawning a separate UNIX
process).

> I want to convert the following C code to Erlang:

Signals are handled by the emulator. I think you would be forced to spawn the
following as a separate UNIX process (erlang port) and do your signal handling
there.

> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/unistd.h>
> #include <signal.h>
> 
> void ctrlc_handler(int sig)
> {
> 	char c;
> 
> 	signal(sig, SIG_IGN);
> 
> 	printf("ctrlc-handler called\n");
> 
> 	printf("do you want to exit[y/n] ");
> 	c = getchar();
> 
> 	if (c == 'y' || c == 'Y')
> 		exit(0);
> 	else
> 		signal(SIGINT, ctrlc_handler);
> }
> 
> 
> int main(int argc, char *argv[])
> {
> 	signal(SIGINT, ctrlc_handler);
> 
> 	while (1)
> 		pause();
> 
> 	return 0;
> }
> 
> In the signal handler function 'ctrlc-handler',
> all the SIGINT signals that occur between the two signal calls
> cannot be caught.

On some operating systems it is necessary to reinstall a signal handler
every time it is called, assuming you want to keep handling the signal.

> Is this semantics carried over in Erlang as well ?

This isn't an erlang-specific issue, but rather an OS-dependent one.

And again, I don't think you are going to be able to (or should even try to)
install a signal handler from an erlang process. Even if you could it would
surely interfere with the emulator internals / runtime environment.

For example, I'm pretty sure the erlang shell already handles SIGINT--that's
why a Ctl-C at the shell yields something like the following:

  Eshell V5.5.2  (abort with ^G)
  1> 
  BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
         (v)ersion (k)ill (D)b-tables (d)istribution

If you really must communicate with signals you should consider spawning an
external UNIX process as an erlang port via erlang:open_port/2.

-Rick



More information about the erlang-questions mailing list