Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб по С и С++ / Лаб_С_№15

.doc
Скачиваний:
65
Добавлен:
17.03.2015
Размер:
43.01 Кб
Скачать

/* ЛАБОРАТОРНАЯ РАБОТА 7 (PROCESS)

УПРАВЛЕНИЕ ПРОЦЕССАМИ

Термин "процесс" относится к программе, которая выполняется под управлением операционной системы.

Используя функции управления процессом можно запустить, остановить и управлять процессом из программы.

Прототипы функций описаны в заголовочном файле process.h.

Запуск нового процесса

Функции exec... и spawn... используют для вызова одного процесса (дочернего) из другого (родительского). В функциях exec... дочерний процесс перекрывает родительский, поэтому возврат управления в родительский процесс невозможен. В функциях spawn... первый параметр mode определяет, что происходит с родительским процессом:

P_WAIT (значение 0) - приостановить на время работы дочернего,

P_OVERLAY (значение 2) - перекрыть родительский процесс дочерним (аналогично exec...). При нормальном завершении функции spawn... возвращают 0, при ошибке все функции возвращают -1.

int execl(char *path, char *arg0, ...,char *argN, NULL);

int spawnl(int mode, char *path, char *arg0, ...,char *argN, NULL);

int execle(char *path, char *arg0, ...,char *argN, NULL,char **env);

int spawnle(int mode, char *path, char *arg0, char *argN, NULL, char **env);

int execlp(char *path, char *arg0, ...,char *argN, NULL);

int spawnlp(int mode, char *path, char *arg0, ... char *argN, NULL);

int execlpe(char *path, char *arg0, ...,char *argN, NULL, char **env);

int spawnlpe(int mode, char *path, char *arg0, ..., char *argN, NULL, char **env);

int execv(char *path, char *argv[]);

int spawnv(int mode, char *path, char *argv[]);

int execve(char *path, char *argv[], char **env);

int spawnve(int mode, char *path, char *argv[], char **env);

int execvp(char *path, char *argv[]);

int spawnvp(int mode, char *path, char *argv[]);

int execvpe(char *path, char *argv[], char **env);

int spawnvpe(int mode, char *path, char *argv[], char **env);

При составлении имени функции к основе (exec и spawn) добавляются суффиксы: v,l,p,e, которые имеют следующие значения: v - вызываемому процессу список аргументов передается в виде массива указателей на строки символов (argv[0]-обязат.). Режим используется, когда число и значения аргументов определяются во время работы. l - вызываемому процессу список аргументов передается в виде отдельных строк (arg0 - обязателен). Режим используется, когда число аргументов постоянное и аргументы известны заранее. p - используется переменная окружения PATH для поиска файла. e - вызываемому процессу передается массив ссылок на переменные окружения env. Path - имя файла, или имя файла с указанием пути от корневого каталога, или имя файла с указанием пути от текущего каталога.

Если имя файла без расширения и не заканчивается точкой ищется файл .exe, .com, иначе - ищется файл без расширения.

Выполнение команды системы

int system(char *command); - дополнит.описана в stdlib.h.

Строка рассматривается как директива командному процессору. Возврат при ошибке: -1, иначе: 0.

Завершение процесса

void exit(int status); - дополнит. описана в stdlib.h.

Завершается процесс после скидывания буферов потоков.

status - код возврата (0 - норм.завершение).

Примеры

Нижеприведенная программа находится в файле c:\user\arg_main.c

и используется для запуска дочернего процесса из родительского.

/* Программа распечатывает на экране аргументы функции main и

окружение среды.

*/

#include <stdio.h>

int main( int argc, char *argv[], char **envp )

{

int i;

printf("аргументы:\n");

for (i=0; i < argc; ++i)

printf("[%2d] %s\n", i, argv[i]);

printf("окружение среды:\n");

for (i=0; envp[i]!=NULL; ++i)

printf("[%2d] %s\n", i, envp[i]);

return 0;

}

Файлы последующих программ находятся в каталоге c:\user\i41, он же является текущим.

Пример 1.

/* Функция execve. Аргументы дочернему процессу передаются через массив указателей на строки, среда окружения роди тельского процесса передается без изменения.

*/

#include <process.h>

#include <stdio.h>

#include <errno.h>

void main(int argc, char *argv[], char **envp)

{

int i;

printf("Аргументы командной строки:\n");

for (i=0; i<argc; i++)

printf("[%2d] : %s\n", i, argv[i]);

printf("функция arg_main...\n");

execve("\\user\\arg_main.exe", argv,envp);

/* оказываемся здесь только в случае ошибки при запуске

дочернего процесса */

perror("exec error");

exit(1);

}

Пример 2.

/* Функция execlpe. Аргументы дочернему процессу передаются как набор строк (последняя обязательно NULL), среда окру жения передается измененная (переменная PATH). Поиск файла arg_main.exe производится с использованием путей, определенных в PATH. */

#include <process.h>

#include <stdio.h>

#include <conio.h>

int main(int argc, char *argv[ ], char *envp[ ] )

{

int result,i= -1;

/* поиск строки окружения, начинающейся на PATH */

while(strncmp(envp[++i],"PATH",4)) ;

/* переменной PATH устанавливается новое значение */

strcpy(envp[i],"PATH=c:\\user");

clrscr();

puts("программа arg_main");

result = execlpe("arg_main.exe", "arg_main.exe", "арг1",NULL, envp);

perror("Error from execlpe");

exit(1);

return 0;

}

Пример 3.

/* Функция spawnvp. Путь до файла arg_main.exe указан относительно текущего каталога. Родительский процесс ожидает окончания дочернего, после чего выполняется функция system.

*/

#include <process.h>

#include <stdio.h>

#include <conio.h>

int main(int argc, char *argv[])

{

int result;

char str[80]="dir";

clrscr();

puts("программа arg_main");

result = spawnvp(P_WAIT, "..\\arg_main.exe", argv);

if (result == -1) /* ошибка при запуске */

{

perror("Error from spawnvp");

exit(1);

}

puts("выполняется команда системы dir");

system(str);

return 0;

}

ЗАДАНИЕ

На основе программы-меню написать программу, запускающую в качестве дочернего процесса несколько ранее написанных программ (одна из них (функции ввода-вывода системного уровня) использует аргументы функции main).

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

Примечание. Для выполнения программы выгрузить TC.

Соседние файлы в папке Лаб по С и С++