Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0626114503_03 - Конспект лекций.doc
Скачиваний:
10
Добавлен:
21.04.2019
Размер:
554.5 Кб
Скачать

Серверная сторона

CREATE_NAMED_PIPE

BOOL ConnectNamePipe(HANDLE h, LPOVERLAPPED Ov)

BOOL DisconnectNamedPipe(HANDLE h)

  1. КЛИЕНТ

BOOL WiatNamedPipe(LPCTSTR Name, DWORD TimeOut)

Подключиться к каналу:

CreateFile

В виде имени – имя канала \\<pc>\piep\<имя>

BOOL CallNamedPipe(

LPCTSTR NamePipe, //имя канала

LPVOID InBuf, // входные параметры

DWORD InSize, // сколько будет отправлено байт

LPVOID OutBuf, // выходной результат

DWORD OutSize, // полный размер буфера

LPDWORD BytesRead, // сколько реально прочитано

DWORD TimeOut)

Второй семестр Управление процессами в среде unix Лекция №1

Введение.

B – это процесс, который запускает процесс Е

Е – это дочерний процесс

Процесс В по отношению к процессу Е – родительский

  1. Родительский процесс, запустив дочерний процесс, должен дождаться кода возврата. (Казус: Если G завершится без завершения Н, то процесс Н будет переведен в поддерево Init)

  2. Если Е завершится, но В не получит код возврата, то процесс Е будет называться зомби процессом.

  3. Система порождения процессов специфична из-за потоков, которые перекрывают адресное пространство

Е динственная возможность создания нового процесса – это создать полную копию уже запущенного процесса

pid_t fork () – создание копии

void main()

{

fork ();

cout<<”1”;

}

Для родителя fork() возвращает номер дочернего процесса, а для дочернего процесса fork() возвращает 0.

Void main ()

{

Cout << fork()<<endl;

}

На экран будет выведено два числа:

  1. 0

  2. Любое число > 0

Void main ()

{

if(fork()==0)

cout <<”1”; else

cout <<”2”;

}

На экране появится и 1, и 2.

int exec *(…) – запуск внешней программы

exec запускает внешнюю программу, замещая ей текущую. Возвращает код ошибки (т.к. она замещает текущую программу, то любой возврат int надо рассматривать как ошибку)

Если «дочка»:

void main()

{

if(fork()==0)

{

exec(“…”); //запуск

exit(1); //внешней программы

}…

}

Если exec – ошибка, т.е. «дочка» не смогла запустить процесс и exit не будет – в результате получим 2-а родительских процесса.

Лекция №2

int clone (int (*fn) (void*),

void *stack,

int flags,

void *args)

Создает новый процесс в самом широком понимании.

  1. указатель на функцию, которая будет запущена как новый поток

  2. указатель на стек для нового процесса (конец стека)

  3. флаги

  4. аргумент функции

Подробнее о флагах

CLONE_PARENT

CLONE_FS – клонировать файловую систему (клонируется корневой или текущий каталог), если флага нет, то С получит копию, если есть, то В и С имеют общие корневой и текущий каталоги.

CLONE_FILES – общими становятся таблицы файлов.

CLONE_SIGHAND – общая обработка сигналов

CLONE_VFORK – если установлен, то запускается процесс, а родительский процесс приостанавливается до остановки дочернего (выход по exit или вызов любой функции exec *)

CLONE_VM – общей становится виртуальная память, в этом случае можно не указывать PARENT, FS, FILES (фактически создается поток).

pid_t wautpid( pid_t pid,

int *status,

int flags)

Ожидает завершение процесса(ов)

  1. Если pid > 0, то мы ждем завершение процесса с указанным pid номером .

Если pid = 0, ждем завершения любого дочернего процесса, который принадлежит к той же группе процессов, что и вызывающий.

Если pid = -1, ждем завершение любого дочернего процесса.

Если pid < -1, ждем завершение любого дочернего процесса из группы, номер которой равно модулю числа pid.

  1. Указатель на нашу переменную, в которую будет записан код завершения процесса.

  2. либо 0

либо WNOHANG – не вешаться, если установлен, то функция проверяет на завершенность процессы, не ожидая их завершения.

Результат > 0 – номер процесса, который завершился;

Результат = 0 – нет завершившихся процессов (дочерние есть, но они не завершены);

Результат = -1 – ошибка.

pid_t wait (int *st) – ждет завершения дочернего процесса.

pid_t getpid() – получить номер процесса.

pid_t getppid() – получить номер родителя.