#include "error.c"3.8.52
system1.c#include <signal.h>system(s) /* run command line s */ char *s;{ int status, pid, w, tty; int (*istat)(), (*qstat)(); ... if ((pid = fork()) == 0) { ... execlp("sh", "sh", "-c", s, (char*)0); exit(127); } ... istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; if (w == -1) status = -1; signal(SIGINT, istat); signal(SIGQUIT, qstat); return status;}3.8.53
system.c/* * Safer version of system for interactive programs */#include <signal.h>#include <stdio.h>system(s) /* run command line s */ char *s;{ int status, pid, w, tty; int (*istat)(), (*qstat)(); extern char *progname; fflush(stdout); tty = open("/dev/tty", 2); if (tty == -1) { fprintf (stderr, "%s: can't open /dev/tty\n", progname); return -1; } if ((pid = fork()) == 0) { close(0); dup(tty); close(1); dup(tty); close(2); dup(tty); close(tty); execlp("sh", "sh", "-c", s, (char*)0); exit(127); } close(tty); istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; if (w == -1) status = -1; signal(SIGINT, istat); signal(SIGQUIT, qstat); return status;}3.8.54
timeout.c/* timeout: set time limit on a process */#include <stdio.h>#include <signal.h>int pid; /* child process id */char *progname;main(argc, argv) int argc; char *argv[];{ int sec = 10, status, onalarm(); progname = argv[0]; if (argc > 1 && argv[1][0] == '-') { sec = atoi(&argv[1][1]); argc--; argv++; } if (argc < 2) error("Usage: %s [-10] command", progname); if ((pid=fork()) == 0) { execvp(argv[1], &argv[1]); error("couldn't start %s", argv[1]); } signal(SIGALRM, onalarm); alarm(sec); if (wait(&status) == -1 || (status & 0177) != 0) error("%s killed", argv[1]); exit((status >> 8) & 0377);}onalarm() /* kill child when alarm arrives */{ kill(pid, SIGKILL);}#include "error.c"3.8.55
toolonglength($0) > 72 { print "Line", NR, "too long:", substr($0,1,60) }3.8.56
ttyin1.cttyin() /* process response from /dev/tty (version 1) */