How do you ignore Quit in csh script?
Paul Blumstein
paulb at ttidca.TTI.COM
Sat Sep 3 08:59:00 AEST 1988
I have a csh script that displays a menu & runs a program with
different options depending on which menu line was selected.
After program termination, the script loops back to the top
and redisplays the menu.
The program is basic a polling program that is terminated
by catching a ^C, cleaning up & terminating. (It could also
terminate on error conditions). The program has a debug mode that
is toggled on & off by Quit signals (^\ key). The program works
fine as a standalone (outside the script).
The problem:
I have "onintr" set in the script to loop the script back to the
beginning when the user hits ^C. However, when ^\ is hit, the script
core dumps, terminates leaving the program running as a background task.
The man page for csh says "the shell generally ignores Quit signals".
Generally seems to mean interactive shells, not shell scripts.
I ended up re-writing the script as an sh script with a trap.
I prefer csh, though. Does anyone have any idea how I could have
accomplished this with csh??? Thanks in advance.
Here is a sample script & prog (cut way down):
------------------------ cut here ----------------------
#! /bin/csh -f
onintr start
start:
set choice=""
echo ""
echo "Which version do you wish to run?"
echo " a. Version 1."
echo " q. None -- exit this program"
echo ""
echo -n Enter letter:
set choice=($<)
if ($choice == "q") exit
switch ($choice)
case a:
a.out
breaksw
default:
echo Incorrect answer, please try again
echo ""
goto start
breaksw
endsw
goto start
------------------------ cut here ----------------------
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#define FALSE 0
#define TRUE 1
#define LOOP_FOREVER for(;;)
#define DEBUG if (debugsw) (void) printf
static struct timeval clock; /* system clock */
static int debugsw = FALSE;/* debug switch */
int toggle_debug(); /* turns debug on & off */
int clean_up(); /* exits gracefully from ^C */
/*************************************************************************/
main()
{
static struct timeval timeout = {1, 0};
(void) signal(SIGQUIT, toggle_debug); /* catch ^\ key for debug */
(void) signal(SIGINT, clean_up); /* catch ^C key */
LOOP_FOREVER {
(void) select(0, (int *) NULL, (int *) NULL, (int *) NULL, &timeout);
}
}
/*************************************************************************/
toggle_debug()
{
debugsw = (debugsw ? FALSE : TRUE); /* toggle the debug state */
(void) printf("\nD>DEBUG turned %s\n", (debugsw ? "ON" : "OFF"));
}
/***************************************************************/
clean_up()
{
puts("");
printf("adios\n");
exit(0);
}
=============================================================================
Paul Blumstein | "I before E except after C" is weird.
Citicorp/TTI | ^^
Santa Monica, CA +-------------------------------------------------
{philabs,csun,psivax}!ttidca!paulb or paulb at ttidca.TTI.COM
DISCLAIMER: My company automatically disagrees with everything I say.
More information about the Comp.unix.questions
mailing list