-->

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

На нашем литературном портале можно бесплатно читать книгу UNIX — универсальная среда программирования, Керниган Брайан Уилсон-- . Жанр: ОС и Сети / Интернет. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX — универсальная среда программирования
Название: UNIX — универсальная среда программирования
Дата добавления: 16 январь 2020
Количество просмотров: 434
Читать онлайн

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

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

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

shell.

 

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

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 91 92 93 94 95 96 97 98 99 ... 187 ВПЕРЕД
Перейти на страницу:

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

$ waitfile troff .out echo troff done &

Программа

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

/* waitfile: wait until file stops changing */

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

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
могла бы просто завершиться по окончании изменения файла.

1 ... 91 92 93 94 95 96 97 98 99 ... 187 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название