david@squid.UUCP (07/30/88)
From squid!david Fri Jul 29 22:17 CDT 1988 remote from occrsh
From: occrsh!squid!david (David Drexler)
Date: Fri, 29 Jul 88 22:17:05 CDT
Message-Id: <88210226A9@squid.UUCP>
Subject: ssignal() vs signal()
PLEASE NOTE: use the address at the end to send mail to me.
I tried to send this privately, but it bounced with a "forwarding
disallowed" error message from att. I suspect that will change a lot of
the rules about whether to post responses, or send them to the author
for summarizing. If you can't get direct mail to the author, what are
you supposed to do?
Turbo Cretin does not implement the unixoid signal() function. The
ssignal() is something quite different. Yeah, I got bit by this one,
too.
The following is exerpted from Norton Guide (a complete on-line stayres
manual, well worth the price!!)
ssignal() Implement Software Signals
#include <signal.h>
int (*ssignal(sig,action))();
int sig; Type of signal
int (*action)(); Action function/Constant
ssignal() is used to establish an action routine for servicing a
signal. Software signals are associated with integers in the range
from 1 to 15. 'sig' is a number identifying the type of signal for
which an action is established. 'action' is either the name of a
user-defined action function or one of the constants SIG_DFL
(default) or SIG_IGN (ignore) (defined in <signal.h>). If the action
function has been established for 'sig', then that action is reset to
SIG_DFL, and the action function is entered with 'sig'.
Returns: The action previously established or SIG_DFL, if the
signal number is illegal.
gsignal() Software Signals
#include <signal.h>
int gsignal(sig);
int sig; Type of signal
gsignal() implements a software-signaling facility. Software signals
are integers ranging from 1 to 15. gsignal() raises the signal given
by 'sig' and executes the action routine.
Returns: The value returned to gsignal() by the action function.
The return values for actions assigned to 'sig' are:
ACTION RETURN
SIG_IGN 1
SIG_DFL 0
Illegal value or 0
no action specified
In all cases, gsignal() takes no action other than
returning a value.
The ssignal() is like signal() in that you can specify a vector to jump
to on a specific event. The difference is that the "events" are ALL user
defined, and activated by gsignal(). For example:
#include <stdio.h>
#include <signal.h>
fubar()
{
puts( "Here we are in fubar()" ) ;
}
main()
{
ssignal( 1, fubar ) ;
gsignal( 1 ) ;
}
...does what you might expect, prints "Here we are in fubar()". Despite
the rhetoric in Norton (which does contain a few minor inaccuracies just
to keep you on your toes), do note that once you call gsignal(), you
have to reset the vector with ssignal() again.
There are a couple ways to snarf a ^C. With input routines, the nicest
way to do it is to use input functions that ignore it, and just look for
the code yourself. Also, there is the ctrlbrk() function. I don't like
it because you get the "^C" printed on the screen. Norton says (and I
qoute :-)
ctrlbrk() Set Control-Break Handler
#include <dos.h>
void ctrlbrk(fptr);
int (*fptr)(void); Handler function
ctrlbrk() sets a new control-break handler function pointed to by
'fptr'. The interrupt vector 0x23 is modified to call the named
function. ctrlbrk() establishes a DOS interrupt handler that calls
the named function indirectly.
The handler function may perform any number of operations and system
calls. The handler function does not have to return; it may use
longjmp() to return to any point in the program.
Returns: ctrlbrk() returns nothing. 0 is returned by the handler
function to abort the current program. Any other value
causes the program to resume execution.
It is the only Turbo Cretin function I know about that actually snarfs a
real interrupt. It isn't too awful hard to steal interrupts on your own,
as long as you know what you're doing. There are a lot of rules, and woe
unto you if you break any of them.
BTW, I run a bbs that has a lot of Turbo Cretin code on it. The board is
SOURCEry System bbs, 405-728-2463 (2400bps), in Oklahoma City.
Happy hacking!
--david
+---+ {the known world}!att \ FidoNet 1:19/1 +---+
| | lll-winken!spl1 ->-!occrsh!squid!david | |
+---+ uokmax.ecn.uoknor.edu / <Squid> UU/FidoGate +---+pk-tle@nada.kth.se (Tommy Levitte) (08/01/88)
>The ssignal() is like signal() in that you can specify a vector to jump >to on a specific event. The difference is that the "events" are ALL user >defined, and activated by gsignal(). [...] Are you real sure ??? If you take a look at the file 'signal.h', you can find SIGINT, and some other words defined for Float Exception, Memory Exception and some others. -- ------------------------------------------------------------------------------- Tommy Levitte (pk-tle@draken.nada.kth.se or gizmo@kicki.stacken.kth.se) -------------------------------------------------------------------------------