[comp.sys.m6809] Pseudo Alarm Daemon

pete@wlbr.EATON.COM (Pete Lyall) (08/02/88)

This is the asynchronous alarm tool that was requested last week.


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	alarmd.c
#	alarmd.hlp
#	alarmd.man
#	alarmd.uue
#	readme
#	talarmd.c
#	talarmd.uue
# This archive created: Mon Aug  1 13:50:07 1988
export PATH; PATH=/bin:$PATH
if test -f 'alarmd.c'
then
	echo shar: will not over-write existing file "'alarmd.c'"
else
cat << \SHAR_EOF > 'alarmd.c'
/* Alarmd - sleep 'n' seconds and then send parent an 
** 'alarm' signal, if they are still alive.
**
** Pete Lyall
** 76703,4230
** 
** Example Usage: 
**
**
** time2sleep = 20;
** sig2send = 10;
** sprintf(parameter,"%d %d\n", time2sleep, sig2send);
** os9fork("alarmd",strlen(parameter),parameter,1,1,0);
**
** Note: calling (parent) process must also set up an
** intercept() or a signal(SIG, routine) to catch the 
** signal coming back from alarmd.
**
*/

#include <stdio.h>
#include <os9.h>

main(argc, argv)

int argc;
char *argv[];

{
     int pid, parent, time, sig2send;
     char pdesc[512];
     struct registers regs;

     if(argc != 3)
          usage();

     time = atoi(argv[1]);
     sig2send = atoi(argv[2]);

     if(time == 0)
          usage();

     /* This will probably require a special sleep.r module that
      * can determine if we are a coco or not to get 'tick' resoltion
      * right. Will be added later. PWL
      */

     sleep(time);

     pid = getpid();

     regs.rg_a = pid;
     regs.rg_x = pdesc;

     /* get our process descriptor */

     if(_os9(F_GPRDSC, &regs) != 0)
          exit(regs.rg_b);

     /* see who the parent is, and if they are still alive */

     parent = pdesc[1];

     if(parent == 0)
          exit(0);

     /* still alive - send the signal */

     if(kill(parent,sig2send) != 0)
          exit(errno);

}


usage()
{
     fputs("\nusage: alarmd [secs to sleep] [signal to send]\n", stderr);
     exit(1);
}
SHAR_EOF
fi # end of overwriting check
if test -f 'alarmd.hlp'
then
	echo shar: will not over-write existing file "'alarmd.hlp'"
else
cat << \SHAR_EOF > 'alarmd.hlp'

Alarmd - a pseudo alarm-clock daemon for use by PROGRAMS.

Syntax: alarmd [seconds (in ASCII)] [signal (in ASCII)] [CARRIAGE RETURN]

NOTE: Must be *forked* by the calling program using f$fork,
      os9fork(), or SYSCALL.

See man page for more detail.

SHAR_EOF
fi # end of overwriting check
if test -f 'alarmd.man'
then
	echo shar: will not over-write existing file "'alarmd.man'"
else
cat << \SHAR_EOF > 'alarmd.man'


    ALARMD (1)                        OS9                         ALARMD (1)


    NAME

         Alarmd - a program to send asynchronous alarm signals to other
         programs.

    SYNOPSIS

         Alarmd [ of seconds] [signal to send]

    DESCRIPTION

         Alarmd was written to provide a timing mechanism external to the
         calling program.  This is useful for protecting against things like
         infinite loops, or waiting a finite period for an event to happen.

         Alarmd is a program unto itself, so it may be called by other
         programs, be they in basic09, C, Pascal09, or assembly.  The
         parameters to alarmd are number of seconds to wait until sending a
         signal, and what signal to send when this time elapses.  These
         parameters should be passed as ASCII strings, separated by one or
         more spaces, and terminated by a carriage return.  The signal is
         always sent to alarmd's parent process, so the f$fork system call
         must be used to create this parent-child relationship (os9fork in
         C, F$fork in assembly, and syscall/syscallp in assembly or
         Pascal09).  If BASIC09's 'SHELL' command or C's  'system()' command
         were used, they would create intermediate shells that would then
         become alarmd's parent, and destroy the parent-child relationship
         required. If the parent dies before alarmd can send its signal,
         alarmd will recognize this  and exit quietly.

         For best efficiency, the alarmd program module should already  be
         loaded in memory, so additional time is not wasted in the load
         process.

    EXAMPLES

         #define SIGALARM 5   /* could be anything */

         int seconds = 15;

         sprintf(parameter,"%d %dn", seconds, SIGALARM);
         if(os9fork("alarmd",strlen(parameter),parameter,1,1,0) == ERROR)
              {
              etc....
              }


         Also see example program provided.

    SEE ALSO








    Last printed: 7/9/88                                              Page 1




    ALARMD (1)                        OS9                         ALARMD (1)


         Talarmd, kill(), sleep(), and intercept()

    BUGS

         Must be the child of the process to be signalled.

         Unless compiled with a different version of the 'sleep()' routine
         than the one currently available in the Kreider library, the timing
         will be slow on a Color Computer.  Sleep() assumes 100 ticks per
         second in Level II is used, and the Color Computer only has 60
         ticks per second.  The net result will be that for each second of
         time in the alarm parameter, the alarmd will take 1.4 seconds.
         This bug in the Kreider library will be fixed in the next release.

    AUTHOR

         Peter W. Lyall, Jr.
         1040 Stern Lane
         Oxnard, CA 93035

              OS9: (805) 985-0632 (1200 baud)
              CIS: 76703,4230
           DELPHI: OS9UGVP
         Internet: pete@wlbr.EATON.COM
             UUCP: ..!{ihnp4,jplgodo,scgvax,voder,trwrb}!wlbr!pete

    































    Last printed: 7/9/88                                              Page 2


SHAR_EOF
fi # end of overwriting check
if test -f 'alarmd.uue'
then
	echo shar: will not over-write existing file "'alarmd.uue'"
else
cat << \SHAR_EOF > 'alarmd.uue'
begin 664 alarmd
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
M```!`````````````````@`!`````````````$8``@``````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
E````````````````````````````````````86QA<FUD`+CV<0``
`
end
SHAR_EOF
fi # end of overwriting check
if test -f 'readme'
then
	echo shar: will not over-write existing file "'readme'"
else
cat << \SHAR_EOF > 'readme'
Alarmd is a support pacakage that will allow programs to use an
external timing and alarm mechanism. It may be used from C,
BASIC09, assembly, or Pascal09. 

An example program 'talarmd' is provided to show one example of
possible use from within a C program.

To see how it works, load 'alarmd' (possibly also the test
program 'talarmd') and type:

    Talarmd 15

Talarmd will tell 'alarmd' to send it an alarm in 15 seconds, and
then go into an infinite loop. The 'talarmd' program will be sent 
an alarm in 15 seconds (21 on a coco - see the manual page for
the reason) that will break it out of its loop.

See the manual page for additional explanations.

Pete Lyall.

SHAR_EOF
fi # end of overwriting check
if test -f 'talarmd.c'
then
	echo shar: will not over-write existing file "'talarmd.c'"
else
cat << \SHAR_EOF > 'talarmd.c'
/* Talarmd - short example program to display proper
**           use of the 'alarmd' program. Note: To be
**           useful, the 'alarmd' program really should
**           be memory resident 
**
** Pete Lyall
** 76703,4230
** 7/9/87
**
*/
#include <stdio.h>

#define SIGALARM 5       /* could be anything */

int ignalarm, gotalarm;
int sigcatcher();        /* predclare it */

main(argc, argv)
int argc;
char **argv;
{
     char parameter[80];

     if(argc != 2)
          usage();

     /* set up a function to catch the alarm */

     intercept(sigcatcher);

     /* now start the 'alarmd' task ticking ..
               **
               ** This could be cleaner by nabbing the 'alarmd's
               ** task id, and making SURE that it's that taskid
               ** that comes back in the 'wait(0)' call in the
               ** signal processing code. It could also be used
               ** to kill the 'alarmd' process if we have to bail
               ** out because of a signal, or whatever.
               **
               ** Also remember - 'alarmd' should be memory resident, 
               ** or you'll waste additional time loading it.
               **
               ** This setup could even be made into a simple
               ** function, i.e 'wakemein(20)' - you get the idea.
               */

     sprintf(parameter,"%s %d\n", argv[1], SIGALARM);
     if(os9fork("alarmd",strlen(parameter),parameter,1,1,0) == ERROR)
     {
          fputs("Whooops! Couldn't start 'alarmd'\n", stderr);
          exit(errno);
     }

     /* now let's do whatever needs to be interrupted */
    
     while(gotalarm == FALSE)
     {
          puts("do wha ditty ditty dum ditty do...", stdout);
     }

     /* at this point, the alarm has broken us free */

     puts("\nWhew! I was tired of singing!");
     exit(0);


}

/* This is the function that catches and evaluates all
** the received signals.
*/

sigcatcher(sig)
int sig;
{
     if(sig == SIGALARM) 
     {
          puts("Received the alarm!");
          wait(0);            /* receive the dead child's carcass */

          /* see if we have it software disabled */

          if(ignalarm)
               puts(".. but I'm ignoring it!");
          else
               gotalarm = TRUE;
     }
     else
          {
          puts("Ooops! Got some other signal ... aborting!");
          exit(sig);
     }
}

usage()
{
     fputs("\nusage: talarmd [seconds]\n");
     exit(1);
}
SHAR_EOF
fi # end of overwriting check
if test -f 'talarmd.uue'
then
	echo shar: will not over-write existing file "'talarmd.uue'"
else
cat << \SHAR_EOF > 'talarmd.uue'
begin 664 talarmd
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
M91`_#18`93/D,JD`_ZY"$*Y$IDE(2$A(JDOF3>Y&$#\%$#\&-&"N9A"N:.YJ
MIFVJ;^;H$1`_`S5@$"4`)A^)3SDT0!\CKF2OJ0&^,(T`"!`_"35`%@`5'S)/
M-`:MN0&^,F([3^VI`:K,__\Y)?5/7SD7``@7^ZWL8A`_!CD``0`!6R<0`^@`
M9``*;'@```````````$````````````````"``$`````````````1@`"````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````````````$!`0$!`0$!`1$1
M$1$1`0$!`0$!`0$!`0$!`0$!`0$!,"`@("`@("`@("`@("`@($A(2$A(2$A(
M2$@@("`@("`@0D)"0D)"`@("`@("`@("`@("`@("`@("`@(@("`@("!$1$1$
J1$0$!`0$!`0$!`0$!`0$!`0$!`0$!"`@("`!`````'1A;&%R;60`Z-/K
`
end
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0
-- 
Pete Lyall (OS9 Users Group VP)|  DELPHI: OS9UGVP  |  Eaton Corp.(818)-706-5693
Compuserve: 76703,4230 (OS9 Sysop) OS9 (home): (805)-985-0632 (24hr./1200 baud)
Internet: pete@wlbr.eaton.com            UUCP: {scgvax,jplgodo,voder}!wlbr!pete