#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;}Несколько слов по поводу описаний: функция
signalSIG_IGNSIG_DFL<signal.h>#define SIG_DFL (int(*)())0#define SIG_IGM (int(*)())1Системный вызов
alarm(n)SIGALRMДля иллюстрации приведем программу
timeoutwatchfor$ timeout -3600 watchfor dmg &Программа
timeout/* 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);}Можете ли вы представить, как реализована
sleeppause(2)sleepalarmДетального описания реализации системы UNIX не существует отчасти потому, что программа является собственностью фирмы. В статье К. Томпсона "UNIX implementation" (BSTJ, July, 1978) описываются основные идеи. Другие статьи, в которых обсуждаются связанные с UNIX темы, это "The UNIX system — a retrospective" (BSTJ, July, 1978) и "The evolution of the UNIX timesharing system" (Symposium on Language Design and Programming Methodology, Springer — Verlag, Lecture Notes in Computer Science #79, 1979). Обе статьи принадлежат Д. Ритчи.
Программа
readslowreadslowНа создание
spname