из гл. 5. Вместо того чтобы запускать ее без ограничения времени работы, установите ограничение в часах:$ timeout -3600 watchfor dmg &
Программа
timeout
демонстрирует почти все возможности, которые мы обсуждали в последних двух разделах. Создан процесс-потомок, родительский процесс устанавливает будильник и затем ждет, пока потомок завершит работу. Если будильник "зазвенел" первым, потомок уничтожается. Делается попытка вернуть состояние потомка при выходе./* timeout: set time limit on a process */
#include
#include
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);
}
Упражнение 7.18Можете ли вы представить, как реализована
sleep
? Подсказка: pause(2)
. При каких обстоятельствах (если это вообще возможно) sleep
и alarm
могли бы помешать друг другу?Историческая и библиографическая справкаДетального описания реализации системы 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). Обе статьи принадлежат Д. Ритчи.
Программа
readslow
была разработана П. Вейнбергером как недорогое средство, позволяющее следить за успехами шахматной машины "Белла" К. Томпсона и Дж. Кондона во время шахматных турниров. "Белла" записывала позиции своей игры в файл, а зрители просматривали файл с помощью readslow
, не отнимая драгоценного времени у машины. (Новейшая версия "Беллы" лишь небольшую долю вычислений выполняет на основной машине, так что проблема снята.)На создание
spname
нас вдохновил Т. Дафф. Статья А. Дархема, Д. Лэмба и Дж. Сакса "Spelling correction in user interfaces" (CACM, October, 1983) представляет иной способ коррекции написания в контексте программы почты.Глава 8Разработка программ
Первоначально системе UNIX предназначалась роль среды для разработки программ. В настоящей главе мы обсудим некоторые применяемые с этой целью программные средства на примере солидной программы — интерпретатора языка программирования, сравнимого по мощности с Бейсиком. Мы выбрали реализацию языка, потому что возникающие здесь проблемы характерны для больших программ. Более того, многие программы полезно рассматривать как языковые процессоры, преобразующие входной поток определенной структуры в последовательность действий и выходной поток, т. е. мы хотим продемонстрировать вам программные средства разработки языков.
В частности, вашему вниманию предлагаются следующие программы:
•
yacc
— генератор синтаксических анализаторов; программа, которая по описанию грамматики языка порождает анализатор;•
make
— программа, определяющая процесс компиляции сложных программ и управляющая им;•
lex
— программа, аналогичная yacc
, но создающая лексические анализаторы.Мы покажем вам приемы разработки программ в несколько этапов — от простого к сложному. Ниже описаны шесть этапов реализации языка, каждый из которых поучителен уже сам по себе. Эти этапы отражают реальный процесс написания программы:
1. Создание калькулятора с четырьмя действиями:
+
, -
, *
, /
(и со скобками). Калькулятор выполняет операции над числами с плавающей точкой, каждая строка состоит из одного выражения; полученное значение печатается сразу.2. Добавление переменных с именами от
а
до z
. В этой версии есть также унарный минус и некоторые средства защиты от ошибок.3. Добавление переменных с именами произвольной длины, встроенных функций для
sin
, exp
и т.п., полезных констант типа π (обозначается как PI
) и операции возведения в степень.4. Внесение внутренних изменений: оператор вычисляется не непосредственно, а порождает код, который впоследствии интерпретируется. Новые возможности не добавляются, но подготавливается переход к п. 5.
5. Добавление структур управления:
if-else
и while
— группирование операторов с помощью и и операции отношений типа >
, <=
и т.п.6. Добавление рекурсивных процедур и функций с параметрами, а также операторов для ввода-вывода строк и чисел.
Окончательная версия языка описана в гл. 9 как пример программных средств подготовки документации системы UNIX. В приложении 2 приводится справочное руководство по калькулятору.
Эта глава довольно объемная, поскольку в ней детально рассматривается, как правильно написать нетривиальную программу. Предполагается, что вы знаете язык Си и имеете под рукой экземпляр справочного руководства по системе UNIX (том 2), поскольку просто невозможно объяснить все нюансы. Будьте готовы к тому, что вам придется прочитать главу несколько раз. Окончательная версия полностью представлена в приложении 3. Заметим, кстати, что мы долго спорили из-за имени языка, но так и не придумали подходящее. Остановились на
hoc
, что означает "калькулятор высокого уровня" (high level calculator).Его версии соответственно называются
hoc1
, hoc2
и т.д.8.1 Этап 1: калькулятор с четырьмя действиями
Прежде всего рассмотрим реализацию
hoc1
— программы с такими же возможностями, как и простейший карманный калькулятор, но гораздо менее удобной для переноса. Она выполняет четыре операции: +
, -
, *
, /
и, имеет скобки с произвольной глубиной вложенности, чем обладают лишь немногие калькуляторы. Если вы введете выражение и символ RETURN, результат будет напечатан в следующей строке:$ hoc1
4*3*2
24
(1+2)*(3+4)
21
1/2
0.5
355/113
3.1415929
-3 - 4
hoc1 : syntax error near line 4 No unary minus yet
$
ГрамматикаС появлением формы Бэкуса-Наура, предложенной для Алгола, языки стали описываться с помощью формальной грамматики. Абстрактное описание грамматики
hoc1
простое и краткое:список: выраж \n
список выраж \n
выраж: NUMBER
выраж + выраж