Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

Дело в том, что контроль ошибок весьма утомителен, но тем не менее важен. Из-за ограниченного объема книги и обширности излагаемого в ней материала мы не уделяли должного внимания этому вопросу. Но в настоящих, "производственных" программах не следует позволять себе игнорировать ошибки.

Упражнение 7.10

Модифицируйте

checkmail
так, чтобы идентифицировать посылающего сообщение: "У вас есть почта". Подсказка:
sscanf
,
lseek
.

Упражнение 7.11

Модифицируйте

checkmail
так, чтобы она не переходила к каталогу почты перед входом в цикл. Окажет ли это ощутимое влияние на ее производительность? Более трудный вопрос: можете ли вы написать версию
checkmail
, которая обходится только одним процессом для оповещения всех пользователей?

Упражнение 7.12

Напишите программу

watchfile
, которая управляет файлом и печатает его с начала всякий раз, как он изменится. Когда бы вы ее использовали?

Упражнение 7.13

Программа

sv
очень "прямолинейна" при обработке ошибок. Модифицируйте ее так, чтобы она продолжала выполняться, даже если не удается обработать некоторый файл.

Упражнение 7.14

Сделайте

sv
рекурсивной: если один из исходных файлов — каталог, то этот каталог и все его файлы обрабатываются таким же образом. Сделайте рекурсивной
cp
. Подумайте, следует ли
cp
и
sv
объединить в одну программу, чтобы
cp -v
не создавала копию, если целевой файл новее файла-источника.

Упражнение 7.15

Напишите программу

random
.

$ random filename

должна выдавать одну строку, произвольно выбранную из файла. Если есть файл

people
, содержащий имена,
random
можно использовать в программе
scapegoat
("козел отпущения"), полезной при случайном определении виновных:

$ cat scapegoat

echo "В этом виноват `random people`!"

$ scapegoat

В этом виноват Кен!

$

Убедитесь в том, что

random
хороша независимо от распределения длины строк.

Упражнение 7.16

Помимо прочего в индексном дескрипторе указаны адреса размещения блоков файла на диске. Рассмотрите файл

<sys/into.h>
, а затем напишите программу
icat
, которая должна читать файлы, описываемые номером записи каталога и устройством диска. (Она, конечно, будет работать только в том случае, если требуемый диск открыт на чтение.) При каких обстоятельствах
icat
полезна?

7.4 Процессы

В этом разделе мы покажем вам, как выполнить одну программу, вызвав ее из другой. Самый легкий путь — привлечь стандартную библиотечную программу

system
, упомянутую, но забракованную в гл. 6. Программа
system
использует один аргумент — командную строку в том виде, в каком она вводится с терминала (за исключением символа перевода строки), и выполняет ее порожденным
shell
. Если командная строка должна быть создана из кусочков, можно прибегнуть к форматированию памяти программой
sprintf
. В конце раздела мы рассмотрим более безопасную версию
system
для работы с диалоговыми программами, но прежде чем изучать программу в целом, обсудим структуры, из которых она составляется.

Создание процесса низкого уровня:
execlp
и
execvp

Самая важная операция - выполнение другой программы без возврата с помощью системного вызова

execlp
. Например, чтобы напечатать дату и выполнить тем самым последнее действие запущенной программы, используют

execlp("date", "date", (char*)0);

Первый аргумент

execlp
есть имя файла команды;
execlp
выбирает путь поиска (т.е.
$PATH
) из вашего окружения и выполняет такой же поиск, как
shell
. Второй и последующие аргументы — это имена и аргументы команд; для новой программы они становятся массивом
argv
. Конец списка отмечен аргументом 0. (См. справочное руководство по
exec(2)
, и вы поймете конструкцию
execlp
.)

Вызов

execlp
перекрывает существующую программу новой, запускает ее и затем завершается. Первоначальная программа получает управление обратно только при возникновении ошибки, например, когда файл не удается найти или он является невыполнимым:

execlp("date", "date", (char*)0);

fprintf(stderr, "Не удалось выполнить 'date'\n");

exit(1);

Если число аргументов вам заранее не известно, полезно применить

execvp
(вариант
execlp
). Вызов выглядит так:

execvp(filename, argp);

где

argp
означает массив указателей к аргументам (таким, как
argv
). Последним в массиве должен быть указатель
NULL
, так что
execvp
может отметить конец списка. Как и для
execlp
,
filename
— это файл, в котором находится программа,
argp
— массив
argv
для новой программы, a
argp[0]
— имя программы.

Ни одна из перечисленных выше программ не обеспечивает расширения в списке аргументов метасимволов типа

<
,
>
,
*
, кавычки и т.п. Если они вам нужны, воспользуйтесь
execlp
и вызовите
/bin/sh
из
shell
, которая выполнит эту работу. Сконструируйте строку
commandline
, содержащую полную команду, как если бы она была напечатана на терминале, например:

execlp("/bin/sh/", "sh", "-с", commandline, (char*)0);

Аргумент

– с
предписывает трактовать следующий аргумент как целую командную строку.

В качестве иллюстрации

exec
рассмотрим программу
waitfile
. Команда

$ waitfile filename [command]

периодически проверяет поименованный файл. Если он не менялся после последней проверки, выполняется

command
. В том случае, когда команда не указана, файл копируется в стандартный выходной поток. С помощью
waitfile
мы контролируем работу
troff
, как в

Поделиться:
Популярные книги

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХVI

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Эпоха Опустошителя. Том VIII

Павлов Вел
8. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VIII

Кукловод

Майерс Александр
4. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кукловод

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Егерь. Вызов

Скиба Николай
3. Зверолов
Фантастика:
боевая фантастика
рпг
уся
фэнтези
попаданцы
6.00
рейтинг книги
Егерь. Вызов

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
6.25
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Товарищ "Чума" 5

lanpirot
5. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 5

Лекарь

Назимов Константин Геннадьевич
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Лекарь

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.50
рейтинг книги
Газлайтер. Том 16