7.4 Процессы
В этом разделе мы покажем вам, как выполнить одну программу, вызвав ее из другой. Самый легкий путь — привлечь стандартную библиотечную программу
systemsystemshellsprintfsystemСоздание процесса низкого уровня: и
execlpexecvpСамая важная операция - выполнение другой программы без возврата с помощью системного вызова
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