[sane-devel] Signal-Handling-Question ( OS/2)

Henning Meier-Geinitz henning@meier-geinitz.de
Sun, 23 Nov 2003 13:35:37 +0100


Hi,

On Fri, Nov 21, 2003 at 01:43:19AM +0100, Franz Bakan wrote:
> But this 'solution' is not perfect. When I now 'Ctrl+C' the scanner stops,
> the error-LED on the scanner (EPSON GT-9500) lights up and
> scanimage tells:
> 
> scanimage.exe: received signal 2
> scanimage.exe: trying to stop scanner
> 
> and _wait's_ until I SIGKILL the process (second Ctrl+C doesn't work).

On the first ctrl-c scanimage calls sane_cancel(). This is done
immediately while a different sane_* api function may be running (e.g.
sane_read(). While this is allowed by the SANE standard, nome backends
may not be able to cope with that.

If you press ctrl-c a second time, scanimage will just exit without
waiting for sane_cancel and the cancelled operation to return.

> - How to tell scanimage that the scanner allready has stopped?

Well, the backend should know about that. E.g. the mustek backend
blocks signals while doing a SCSI transfer. After the transfer is
finished, the reader_process terminates and sanei_scsi_flush_all is
called.

> In a second approach I've tried the following:
> 
>  /* Prevent the calling process from being killed */
>  sigfillset(&all);
>  sigprocmask(SIG_BLOCK, &all, &oldset);
> 
>   DosDevIOCtl()
> 
>  /* Now it is ok to be killed */
>  sigprocmask(SIG_SETMASK, &oldset, NULL);
> 
> But this way the machine still crashes hard when entering Ctrl+C
> (Perhaps I made a mistake with the syntax?)
> 
> - How do I correctly delay SIG_INT with unix-like functions?

For how to block sigterm, see the mustek backend.

TI think threading just does not work with those signals as expected.
I think Gerhard has already written an email about that topic on
sane-devel some time ago.

Bye,
  Henning