Читайте также:
|
|
Тема: «Управление задачами и памятью в Windows»
(2 часа)
Для управления задачами используется механизм «предок-потомок».
Программа, которая запускается на исполнение, называется программой-потомком (child program – дочерняя программа). Программа, которая запускает дочернюю программу, называется программой-предком (parent program – родительская программа). Функции языка С, работающие с процессами, находятся в библиотеке <PROCESS.H>.
Для того чтобы запустить дочернюю программу с возвратом в родительскую, используются следующие функции:
int spawnl(int mode, char *path, char *arg0, …, NULL);
int spawnle(int mode, char *path, char *arg0, …, NULL, char **env);
int spawnlp(int mode, char *path, char *arg0, …, NULL);
int spawnlpe(int mode, char *path, char *arg0, …, NULL, char **env);
Параметры:
int MODE – определяет режим. Режим имеет 5 предопределенных значений:
1. P_WAIT – предок останавливается и запускается потомок, после завершения которого, управление возвращается в предок;
2. P_DETACH – потомок и родитель работают параллельно, но потомок работает в фоновом режиме;
3. P_NOWAIT – потомок и родитель работают параллельно;
4. P_NOWAITO – потомок и родитель работают параллельно, но процесс потомка не сохраняется;
5. P_OVERLAY – потомок замещает предка, т.е. предок прекращает свое существование и поэтому невозможен возврат управления в программу предок.
Если функция spawnl() по каким-либо причинам не может быть выполнена, в точку вызова возвращается -1 и во внешнюю переменную errno записывается код ошибки.
Коды ошибок, возвращаемых функциями spawnl():
Константа Причина ошибки
EINVAL Неправильный аргумент
E2BIG Список аргументов слишком велик;
ENOENT Не найден файл загрузочного модуля;
ENOEXEC Запускаемый на выполнение файл не является запускаемым или поврежден;
ENOMEM Ошибка при выделении оперативной памяти потомку.
Если работа программы-потомка была успешно исполнена, то функции spawnl() возвращают код завершения потомка.
Буква ‘p’ в названии функции говорит о том, что для поиска файла потомка будут просматриваться не только маршрут, заданный параметром path, но и маршруты, указанные в строке среды PATH, если поиск по маршруту path завершается неудачей.
Буква ‘е’ говорит о том, что при запуске программы-потомка будет переопределяться среда. Массив указателей envp содержит указатели на ASCIIZ-строки новой среды. Если буква ‘е’ в названии функции отсутствует, потомок наследует среду предка в неизменном виде.
Буква ‘l’ в названии функции свидетельствует о том, что в точку входа main() потомка передается известное заранее число слов, указатели на которые задаются при вызове функции. Если число параметров в функции заранее неизвестно, то единственный выход – использовать массив указателей и передавать адрес начала этого массива.
Все функции spawn***(), имеющие в названии букву ‘v’, передают в качестве второго аргумента указатель на массив указателей argv.
char *path – указатель на ASCIIZ – строку спецификации файла загрузочного модуля программы-потомка. Если не задается директория и/или накопитель, то поиск файла выполняется в текущих директории и (или) накопителе.
char *arg0, char *arg1, …, NULL – указатели на ASCIIZ – строки, образующие в совокупности командную строку запускаемой на выполнение программы (указатели на отдельные слова командной строки).
Пример
1. Запуск дочерней программы (вызываемой) с возвратом в родительскую (вызывающую).
z1.cpp: //родительская программа (процесс)
#include<stdio.h>
#include<process.h>
#include<conio.h>
void main(void){
clrscr();
printf("Запушена родительская программа\n");
spawnl(P_WAIT,"test.exe","arg1","arg2",NULL);
}
test.cpp: //дочерняя программа (процесс)
#include<stdio.h>
void main(int kol_arg, char **arg){
printf("\nДанная программа является дочерней\n");
for(int i=0;i<kol_arg; i++){
printf("Аргумент %d = %s\n",i,arg[i]);
}
}
Данная программа запускает процесс потомок и создает для него среду окружения (набор внешних переменных, т.е. строк), которые программа может использовать.
z1e.cpp: //родительская программа
#include<stdio.h>
#include<process.h>
#include<conio.h>
void main(void){
char *env[]={"System Programm = 3 and 2 course",
"Laboratornay = Number 2",
"Rk.com=c:\\rk.com",0,0 };
clrscr();
printf("Запушена родительская программа\n");
spawnle(P_WAIT,"test_z1e.exe","arg1","arg2",NULL,env);
}
test_z1e.cpp:// дочерняя программа
#include<stdio.h>
#include<stdlib.h>
void main(int kol_arg, char **arg){
printf("\nДанная программа является дочерней\n");
printf("Значение аргумента 1=%s\n",
getenv("Laboratornay "));
printf("Значение аргумента 2=%s\n",
getenv("System Programm "));
printf("Значение аргумента 3 \
(передача дочерней программе \
пути к программе \n \
rk.com)=%s\n",getenv("Rk.com"));
}
Дата добавления: 2015-07-11; просмотров: 105 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Лабораторная работа №6 | | | Задание на выполнение |