Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по дисциплине ЛииСРВ.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
270.85 Кб
Скачать

Практическое задание

«СИ-функции работы с файлами»

1. Написать программу на СИ++, выполнение которой позволяет:

создать файл,

считать данные с клавиатуры в буфер;

поместить данные из буфера в созданный файл;

закрыть этот файл;

открыть этот файл и вывести его содержимое на экран монитора, закрыть файл.

2. Написать программу на СИ++, выполнение которой позволяет:

проверить наличие файла на диске;

если файл существует, открыть его. Если файл не существует создать его;

считать данные с клавиатуры в буфер;

поместить данные из буфера в созданный файл;

закрыть этот файл.

Отобразить содержимое файла на экране.

3. Написать программу на СИ++, выполнение которой позволяет:

проверить наличие двух файлов на диске;

если файлы существуют, открыть их. Если файлы не существуют, создать их, ввести данные;

перенаправить информацию из одного файла в другой;

закрыть файлы.

Отобразить содержимое файлов на экране.

2.3.2 СИ-функции управления процессами

Цель: изучение системных функций, обеспечивающих управление процессами в среде ОС семейства UNIХ: их создание, удаление, изменение приоритетности и т.п.

Основные понятия

Системный вызов fork

Системный вызов fork (порождение нового процесса) имеет следующий формат:

pid = fork()

int pid;

Системный вызов fork служит для создания нового процесса. Новый процесс (процесс-потомок) является полной копией процесса-предка, за исключением того, что процесс-потомок имеет свой уникальный идентификатор процесса (РID). Поскольку новый процесс сам может выступать в качестве порождающего, его идентификатор процесса-предка (РРID), естественно, отличается от соответствующего идентификатора породившего его процесса.

Новый процесс имеет собственную копию таблицы дескрипторов открытых файлов, но эти дескрипторы ссылаются на те же самые файлы, что и дескрипторы процесса-предка, и имеют с ним общие указатели позиций чтения/записи. Так, при выполнении операции 1sееk в порожденном процессе, может измениться и позиция чтения/записи файла в процессе-предке. Это свойство, в частности, используется командными языками SН СSН для переопределения файлов стандартного ввода/вывода и организации конвейеров команд. Счетчики использованных ресурсов порожденного процесса инициализируются нулевыми значениями. В случае успешного завершения, системный вызов fork возвращает значение 0 порожденному процессу и идентификатор нового процесса - породившему. При неудачном завершении вызова возвращается значение -1.

Системный вызов wait

Системный вызов wait (ожидание завершения процесса-потомка) имеет следующий формат:

pid = wait (status)

int pid;

int *status;

pid = wait(0)

int = pid;

Системный вызов wait задерживает вызвавший его процесс до поступления сигнала или завершения одного из порожденных им процессов. Если какой-нибудь порожденный процесс завершился в период времени с момента последней выдачи команды wait производится немедленный возврат. Если порожденные процессы отсутствуют, производится немедленный возврат с установкой бита ошибки (соответственно, с возвратом -1). При нормальном возврате, системный вызов wait получает идентификатор завершившегося порожденного процесса. В случае нескольких порожденных процессов нужно произвести несколько вызовов wait , чтобы отследить признаки завершения всех порожденных процессов. При успешном завершении вызова wait , значение status всегда не равно нулю и содержит код возврата и статус завершения порождённого процесса. Если порождающий процесс завершается, не ожидая своих потомков, их наследует стартовый процесс (РID=1). Вызов автоматически перезапускается, если процесс получает сигнал во время ожидания своих потомков. При нормальном завершении выдается идентификатор завершившегося процесса. В случае ошибки - значение -1 и код ошибки в переменной errnо.