UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
7.4 Процессы
В этом разделе мы покажем вам, как выполнить одну программу, вызвав ее из другой. Самый легкий путь — привлечь стандартную библиотечную программу
system
system
shell
sprintf
system
execlp
execvp
Самая важная операция - выполнение другой программы без возврата с помощью системного вызова
execlp
execlp("date", "date", (char*)0);
Первый аргумент
execlp
execlp
$PATH
shell
argv
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
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