home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / safe / safe.c < prev   
C/C++ Source or Header  |  1986-11-30  |  2KB  |  107 lines

  1. /* safe - Mike Blackwell - Aug 1986 */
  2. /* safe.c - safeguard a program: kill it after `n` seconds if its still alive */
  3.  
  4. #include <signal.h>
  5. #include <stdio.h>
  6.  
  7. /* delay constants */
  8. #define MINDELAY    10
  9. #define MAXDELAY    60*60
  10. #define DEFDELAY    60
  11. #define DLYMSG        "safe: <delay> must be between %d and %d seconds\n"
  12. #define WARNING        "\007\007safe: killing process %d in %d seconds\n"
  13. #define BELL        "\007\007"
  14. #define USAGE        "Usage:\n\tsafe -d <delay> -b -w <warning>\n"
  15.  
  16. int pid;
  17.  
  18. main(argc,argv)
  19. int argc;
  20. char *argv[];
  21. {
  22.     int done(),maim();
  23.     unsigned int delay = DEFDELAY;
  24.     unsigned int warndelay = 0;
  25.     int opt;
  26.     extern char *optarg;
  27.     extern int optind;
  28.     short int bell = 0;
  29.  
  30.     while ((opt = getopt(argc,argv,"d:bw:")) != EOF) {
  31.         switch (opt) {
  32.         case 'd':
  33.             sscanf(optarg,"%d",&delay);
  34.             if (delay < MINDELAY || delay > MAXDELAY) {
  35.                 fprintf(stderr,DLYMSG,MINDELAY,MAXDELAY);
  36.                 exit(-1);
  37.             }
  38.             break;
  39.         case 'b':
  40.             bell = 1;
  41.             break;
  42.         case 'w':
  43.             sscanf(optarg,"%d",&warndelay);
  44.             break;
  45.         case '?':
  46.             fprintf(stderr,USAGE);
  47.             exit(-1);
  48.             break;
  49.         }
  50.     }
  51.  
  52.     if (argv[optind] == NULL) {
  53.         fprintf(stderr,"safe: no program to execute\n");
  54.         exit(1);
  55.     }
  56.  
  57.     if (warndelay >= delay) {
  58.         fprintf(stderr,
  59.       "safe: delay less than warning time, no warning will be given\n");
  60.         warndelay = 0;
  61.     }
  62.  
  63.     if (delay > warndelay) {
  64.         delay -= warndelay;
  65.     }
  66.  
  67.     pid = fork();
  68.     if (pid == -1) {
  69.         fprintf(stderr,"safe: Can't fork\n");
  70.         perror("safe");
  71.         exit(-1);
  72.     }
  73.     if (pid == 0) {        /* child process */
  74.         if (execvp(argv[optind],&argv[optind]) == -1) {
  75.             perror("safe");
  76.             exit(-1);
  77.         }
  78.     } else {        /* parent - monitor and kill */
  79.         signal(SIGCLD,done);
  80.         signal(SIGINT,maim);
  81.         sleep(delay);
  82.         if (warndelay != 0) {
  83.             if (bell)
  84.                 fprintf(stderr,BELL);
  85.             else
  86.                 fprintf(stderr,WARNING,pid,warndelay);
  87.             sleep(warndelay);
  88.         }
  89.         maim();
  90.         exit(1);
  91.     }
  92. }
  93.  
  94. maim()
  95. {
  96.     signal(SIGCLD,SIG_IGN);
  97.     kill(pid,SIGKILL);
  98.     fprintf(stderr,"safe: Process %d killed \n",pid);
  99.     exit(1);
  100. }
  101.  
  102. done()
  103. {
  104.     fprintf(stderr,"safe: Process terminated\n");
  105.     exit(0);
  106. }
  107.