int spawnlp(int mode, char *path, char *arg0, …, NULL);
int spawnlpe(int mode, char *path, char *arg0, …, NULL, char **env);
Параметры:
int MODE – определяет режим. Режим имеет 5 предопределенных значений:
P_WAIT – предок останавливается и запускается потомок, после завершения которого, управление возвращается в предок; P_DETACH – потомок и родитель работают параллельно, но потомок работает в фоновом режиме; P_NOWAIT – потомок и родитель работают параллельно; P_NOWAITO – потомок и родитель работают параллельно, но процесс потомка не сохраняется; 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",
"=c:\\",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 \
)=%s\n",getenv(""));
}
Задание на выполнение
Написать программы предок и потомок. В программе-потомке выделить динамическую память под матрицу размерности NxM, в которой вычислить:
1 вариант: сумму элементов, меньших заданного K.
2 вариант: сумму отрицательных элементов.
3 вариант: сумму положительных элементов.
4 вариант: количество положительных элементов.
5 вариант: сумму элементов K-го столбца.
Полученное значение вывести на экран в программе-потомке, передать в программу-предок и вывести на экран в программе-предке. Потомок запускать в режиме P_WAIT. Запуск осуществлять с пояснительными сообщениями.
Пояснить разницу между режимами.
Работу выполнять в среде программирования BorlandC++Builder.
Для работы в системе программирования Borland C++ Builder необходимо выполнить следующие действия:
Запустить Borland C++ Builder; В главном меню выбрать пункт Файл (File); В меню Файл (File) выбрать пункт Новый (New); В появившемся окне выбрать Консольное приложение (Console Wizard), как показано на рис. Нажать кнопку OK.

Лабораторная работа №8
Тема: «Управление вводом/выводом и файловые системы»
(2 часа)
Информация во внешней памяти (на диске) хранится в виде файлов – именованных объектов, доступ к которым обеспечивает операционная система. Поддержка ОС состоит в том, что в ней имеются средства:
- Создания файлов; Уничтожения файлов; Поиска файлов на внешнем носителе информации; Чтения и записи данных из файлов и в файлы; Открытия файлов; Закрытия файлов; Позиционирования файлов.
Рассматривая взаимосвязь файлов с потоками ввода/вывода, следует отметить существование следующих процедур:
- Создание файла; Создание потока; Открытие файла; «присоединение» файла к потоку; обмены с файлом с помощью потока; «отсоединение» файла от потока; закрытие файла; уничтожение файла.
Все перечисленные действия могут быть выполнены с помощью средств библиотеки классов ввода/вывода языка С++.
Потоки для работы с файлами создаются как объекты следующих классов:
- ofstream – для вывода (записи) данных в файл; ifstrem – для ввода (чтения) данных из файла; fstream – для чтения и для записи данных (двунаправленный обмен).
Пример:
#include<fstream. h>
ofstream outFile; /*определяет выходной файловый поток*/
ifstream inFile; //определяет входной файловый поток
fstream ioFile; /*определяет файловый поток для ввода и вывода*/
Создание файлового потока связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока.
Открытие файла в самом общем смысле означает процедуру, информирующую систему о тex действиях, которые предполагается выполнять с файлом.
Создав файловый поток, можно "присоединить" его к конкретному файлу с помощью компонентной функции open(). С ее помощью можно не только открыть файл, но и связать его с уже определенным потоком. Формат функции:
void open (const char *fileName,
int mode=умалчиваемое_значение,
int protection=умалчиваемое_значение);
Первый параметр – fileName – имя уже существующего или создаваемого заново файла. Это строка, определяющая полное или сокращенное имя файла в формате, регламентированном операционной системой. Второй параметр - mode (режим) – дизъюнкция флагов, определяющих режим работы с открываемым файлом(например, только запись или только чтение). Флаги определены следующим образом:
enum ios::open_mode {
in = 0x01, // Открыть только для чтения
out = 0x02, // Открыть только для записи
ate = 0x04,//При открытии искать конец файла
app =0x08,//Дописывать данные в конец файла
trunk =0x10,// Вместо существующего создать новый файл,
nocreate=0x20,//Не открывать новый файл (Для несуществующего файла функция open выдаст ошибку)
noreplace=0x40,// Не открывать существующий файл (Для существующего выходного файла, не имеющего режимов ate или арр, выдать ошибку)
binary=0x80,//Открыть для двоичного (не текстового) обмена.
}
Умалчиваемое значение параметра mode зависит от типа потока, для которого вызывается функция open () .
Третий параметр - protection (защита) - определяет защиту и достаточно редко используется. Точнее, он устанавливается по умолчанию, и умалчиваемое значение обычно устраивает программиста.
Открытие и присоединение файла к конкретному файловому потоку обеспечивается таким вызовом функции open():
имя_потока. open (имя_файла, режим, защита) ;
Здесь имя_потока - имя одного из объектов, принадлежащих классам ofstream, ifatream, fstream. Примеры вызовов для определенных выше потоков:
outFile. open(“C:\\X\\RESULT. DAT");
inFile. open("DATA. TXT");
ioFile. open("CHAHGE. DAT", ios :: out);
При открытии файлов с потоками класса ofstream второй параметр по умолчанию устанавливается равным ios::out, т. е. файл открывается только для вывода. Таким образом, файл C:\X\RESULT. DAT после удачного выполнения функции open() будет при необходимости (если он не существовал ранее) создан, а затем открыт для вывода (записи) данных в текстовом режиме обмена и присоединен к потоку outFile. Теперь к потоку outFile может применяться, например, операция включения «, как к стандартным выходным потокам cout, cerr.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


