Брайан Керниган - UNIX — универсальная среда программирования

Тут можно читать онлайн Брайан Керниган - UNIX — универсальная среда программирования - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Финансы и статистика, год 1992. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX — универсальная среда программирования
  • Автор:
  • Жанр:
  • Издательство:
    Финансы и статистика
  • Год:
    1992
  • Город:
    Москва
  • ISBN:
    5-289-00253-4
  • Рейтинг:
    5/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Брайан Керниган - UNIX — универсальная среда программирования краткое содержание

UNIX — универсальная среда программирования - описание и краткое содержание, автор Брайан Керниган, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.

Для программистов-пользователей операционной системы UNIX.

UNIX — универсальная среда программирования - читать онлайн бесплатно ознакомительный отрывок

UNIX — универсальная среда программирования - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Брайан Керниган
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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, как в

$ waitfile troff .out echo troff done &

Программа waitfileиспользует fstat, чтобы выявить время последнего изменения файла.

/* waitfile: wait until file stops changing */

#include

#include

#include

char *progname;

main(argc, argv)

int argc;

char *argv[];

{

int fd;

struct stat stbuf;

time_t old_time = 0;

progname = argv[0];

if (argc < 2)

error("Usage: %s filename [cmd]", progname);

if ((fd = open(argv[1], 0)) == -1)

error("can't open %s", argv[1]);

fstat(fd, &stbuf);

while(stbuf.st_mtime != old_time) {

old_time = stbuf.st_mtime;

sleep(60);

fstat(fd, &stbuf);

}

if (argc == 2) { /* copy file */

execlp("cat", "cat", argv[1], (char*)0);

error("can't execute cat %s", argv[1]);

} else { /* run process */

execvp(argv[2], &argv[2]);

error("can't execute %s", argv[2]);

}

exit(0);

}

Мы рассмотрели пример работы как execlp, так и execvp. Эта программа выбрана в качестве иллюстрации, поскольку она весьма полезна, но возможны и другие варианты. Так, waitfileмогла бы просто завершиться по окончании изменения файла.

Упражнение 7.17

Модифицируйте watchfile(упр. 7.12) так, чтобы она имела то же свойство, что и waitfile: в отсутствие commandкопируется файл, в противном случае выполняется команда. Могли бы watchfileи waitfileразделять исходную программу? Подсказка: argv[0].

Управление процессами: forkи wait

Следующий шаг — вновь получить управление после запуска программы с помощью execlpи execvp. Так как эти программы просто "перекрывают" старую программу новой, для сохранения старой требуется сначала разбить ее на две копии. Одна из копий может быть перекрыта, в то время как другая ждет новую, перекрывающую ее программу, чтобы завершиться. Разбиение выполняется с помощью системного вызова fork:

proc_id = fork();

Программа разбивается на две копии, каждая из которых продолжает работать. Они отличаются лишь значением, возвращаемым fork, — номером процесса process-id. В первом процессе ( потомке ) proc_idравен нулю, во втором ( родительском ) proc_idесть номер процесса-потомка. Итак, вызвать другую программу и вернуться можно следующим образом:

if (fork() == 0)

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

Фактически этого достаточно, за исключением обработки ошибок. Forkделает две копии программы. В процессе-потомке forkвозвращает нуль, так что он вызывает execlp, которая выполняет commandlineи затем завершается. В родительском процессе forkвозвращает не нуль, поэтому execlpпропускается. (При наличии ошибки forkвозвращает -1-)

Чаще родительский процесс ожидает, пока потомок закончит работу, прежде чем продолжить свое выполнение, для чего используется системный вызов wait:

int status;

if (fork() == 0)

execlp(...); /* потомок */

wait(&status); /* родитель */

Однако при этом не контролируются ошибки, такие, как сбои execlpи fork, или возможность одновременной работы нескольких процессов-потомков ( waitвозвращает номер завершившегося процесса-потомка, если вы хотите сравнить его со значением, возвращенным fork). Тем не менее эти три строки являются сердцевиной стандартной функции system.

Значение status, возвращаемое wait, содержит в своих младших восьми разрядах системное представление кода завершения процесса-потомка; оно равно нулю при нормальном завершении и не равно нулю при разного рода затруднениях. Следующие старшие восемь битов берутся из аргумента вызова exitили возвращаются из main, которая вызывает окончание выполнения процесса-потомка.

Если программа вызывается из shell, три дескриптора файла, 0, 1 и 2, ссылаются на соответствующие файлы, и все остальные дескрипторы доступны для использования. Когда эта программа вызывает другую, в соответствии с профессиональной этикой указанные условия должны быть соблюдены. Ни fork, ни execне влияют никоим образом на открытые файлы; оба процесса, родитель и потомок, имеют одни и те же открытые файлы. Если процесс-родитель буферизует выходной поток, который необходимо вывести до процесса-потомка, родитель должен очистить свой буфер ранее execlp. И, наоборот, при буферизации родителем входного потока потомок потеряет информацию, которая читалась родителем. Выходной поток может быть выведен, но входной нельзя "положить назад". Обе ситуации являются следствием реализации входного или выходного потока стандартной библиотекой ввода-вывода, обсуждавшейся в гл. 6, поскольку при этом и ввод, и вывод буферизуются обычным образом.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Брайан Керниган читать все книги автора по порядку

Брайан Керниган - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




UNIX — универсальная среда программирования отзывы


Отзывы читателей о книге UNIX — универсальная среда программирования, автор: Брайан Керниган. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x