mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-11-04 22:08:21 +00:00
123 lines
3.2 KiB
C
123 lines
3.2 KiB
C
/*
|
|
* handlesigs: a test program for GNO that waits for signals.
|
|
* It is designed to be run in the background and takes two optional
|
|
* parameters: location of kill command and name of test script to be
|
|
* created. From the shell do something like this:
|
|
*
|
|
* handlesigs ../kill /tmp/testsigs > /tmp/siglist &
|
|
* sleep 10
|
|
* chtyp -l exec /tmp/testsigs
|
|
* /tmp/testsigs
|
|
* cat /tmp/siglist
|
|
*
|
|
* (See the script /src/gno/bin/kill/tests/dotests.)
|
|
*
|
|
* Written by Dave Tribby beginning January 20, 1998
|
|
* $Id: handlesigs.c,v 1.1 1998/02/08 23:47:13 tribby Exp $
|
|
*/
|
|
|
|
#include <err.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <signal.h>
|
|
#include <gno/gno.h>
|
|
#include <unistd.h>
|
|
|
|
/* Program name */
|
|
char *prog_name;
|
|
/* GNO process ID */
|
|
pid_t process_id;
|
|
/* Received signal */
|
|
int received_sig=0;
|
|
|
|
|
|
/*
|
|
* GNO Signal handler routine
|
|
*/
|
|
#pragma databank 1
|
|
void SigHandler(int sig, int code)
|
|
{
|
|
/* Keep it simple: just set global variable */
|
|
received_sig = sig;
|
|
}
|
|
#pragma databank 0
|
|
|
|
|
|
int main (int argc, char **argv)
|
|
{
|
|
/* Command-line parameters and their default values */
|
|
char *def_cmdname="../kill", *cmdname=def_cmdname;
|
|
char *def_cmdfile="/tmp/killtest", *cmdfile=def_cmdfile;
|
|
|
|
int i;
|
|
sig_t *sig_rtnval;
|
|
FILE *cf;
|
|
|
|
/* Get parameters: program name, location of kill command, */
|
|
/* and name of command script to be created. */
|
|
prog_name = argv[0];
|
|
if (argc > 1)
|
|
cmdname = argv[1];
|
|
if (argc > 2)
|
|
cmdfile = argv[2];
|
|
|
|
/* Are we running under the GNO kernel? */
|
|
if ( !needsgno() ) {
|
|
fprintf(stderr, "ERROR: %s can only run under the GNO kernel!\n", prog_name);
|
|
return 1;
|
|
}
|
|
|
|
/* Install the GNO signal handler for all possible signals */
|
|
fprintf(stderr,"Installing GNO signal handler routine for all interrupts...\n");
|
|
for (i = 1; i < NSIG; i++) {
|
|
sig_rtnval = signal(i, SigHandler);
|
|
}
|
|
|
|
/* Get process ID */
|
|
process_id = getpid();
|
|
|
|
/* Create file to send test signals */
|
|
fprintf(stderr, "Creating test command file %s\n", cmdfile);
|
|
if ((cf = fopen(cmdfile, "w")) == NULL)
|
|
err(1, "%s", cmdfile);
|
|
|
|
/* Send the default signal (15) */
|
|
fprintf(cf, "%s %d\n", cmdname,process_id);
|
|
/* Send all the legal signals, using alternate formats for first two */
|
|
for (i = 1; i < NSIG; i++) {
|
|
switch (i) {
|
|
case 1:
|
|
fprintf(cf, "%s -s %s %d\n", cmdname,sys_signame[i],process_id);
|
|
break;
|
|
case 2:
|
|
fprintf(cf, "%s -%s %d\n", cmdname,sys_signame[i],process_id);
|
|
/* Leave out the signals that mess up the tests! */
|
|
case 9:
|
|
case 17:
|
|
case 18:
|
|
case 19:
|
|
break;
|
|
default:
|
|
fprintf(cf, "%s -%d %d\n", cmdname,i,process_id);
|
|
}
|
|
}
|
|
/* Make KILL (9) the last signal sent */
|
|
fprintf(cf, "%s -s KILL %d\n", cmdname,process_id);
|
|
fclose(cf);
|
|
|
|
/* Hang around waiting for a signal */
|
|
fprintf(stderr, "Waiting for a signal to occur. To terminate, use\n");
|
|
fprintf(stderr, " kill -s KILL %d\n", process_id);
|
|
while (1) {
|
|
procreceive();
|
|
printf("Program %s received signal %2d", prog_name, received_sig);
|
|
if (received_sig <= NSIG) printf(" (%s)", sys_signame[received_sig]);
|
|
printf("\n");
|
|
received_sig = 0;
|
|
fflush(stdout);
|
|
}
|
|
|
|
return 0;
|
|
}
|