UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
7.4 Процессы
В этом разделе мы покажем вам, как выполнить одну программу, вызвав ее из другой. Самый легкий путь — привлечь стандартную библиотечную программу
systemsystemshellsprintfsystemexeclpexecvpСамая важная операция - выполнение другой программы без возврата с помощью системного вызова
execlpexeclp("date", "date", (char*)0);Первый аргумент
execlpexeclp$PATHshellargvexec(2)execlpВызов
execlpexeclp("date", "date", (char*)0);fprintf(stderr, "Не удалось выполнить 'date'n");exit(1);Если число аргументов вам заранее не известно, полезно применить
execvpexeclpexecvp(filename, argp);где
argpargvNULLexecvpexeclpfilenameargpargvargp[0]Ни одна из перечисленных выше программ не обеспечивает расширения в списке аргументов метасимволов типа
<>*execlp/bin/shshellcommandlineexeclp("/bin/sh/", "sh", "-с", commandline, (char*)0);Аргумент
-сВ качестве иллюстрации
execwaitfile$ waitfile filename [command]периодически проверяет поименованный файл. Если он не менялся после последней проверки, выполняется
commandwaitfiletroff$ waitfile troff .out echo troff done &Программа
waitfilefstat/* 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);}Мы рассмотрели пример работы как
execlpexecvpwaitfile
