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.

В появившемся окне установить параметры, как показано на рис. Нажать кнопку OK.

В появившемся окне осуществляется набор и редактирование текста программы. Для запуска программы использовать клавишу F9 или пункт главного меню Запуск (Run).

Лабораторная работа №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