Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа 5
Работа с файловыми дескрипторами и каналами.
1 Работа с файловыми дескрипторами
В этом и последующих заданиях для манипуляций с файловыми дескрипторами (ФД) используйте системные вызовы dup(), dup2(). Учитывая буферизацию ввода-вывода, для корректного вывода в конце каждой выводимой строки ставьте признак конца строки. (см. http://linuxdoc.ru/stdin-stdout-stderr.html)
1. 1 Напишите программу, которая считывает данные от пользователя и выводит ответное сообщение на терминал, используя для этого команды для работы с файлами read(), write().
1. 2 Напишите программу, которая позволяет определить для данного процесса максимальное количество одновременно
1) используемых файловых дескрипторов (ссылающихся, возможно, на один файл);
2) открытых файлов.
1. 3 Напишите программу, которая записывает в stdin, а считывает из stdout. Объясните результат. Затем свяжите stdin с непустым файлом fin, а stdout с непустым файлом fout на этапе запуска программы следующим образом: ./command < fin > fout.
Выведите содержимое файлов и объясните полученные изменения.
2 Взаимодействие процессов через pipe
В заданиях этого пункта процессы передают данные (сообщения) в канал через файловый дескриптор 1, а считывают через дескриптор 0. При успешной передаче/приеме процесс должен выводить на экран передаваемые/полученные данные вместе с номером файлового дескриптора, через который эти данные переданы/получены.
2. 1 Напишите программу, которая запрашивает у пользователя сообщение, передает его через канал и считывает из него.
2. 2 Создайте программу-родитель, которая порождает программу-ребенка c использованием exec() (никакие параметры не передаются!) и обменивается с ней данными через два pipe: один канал служит для передачи данных от родителя к ребенку, другой наоборот.
2. 3 Создайте программу-родитель, которая запрашивает у пользователя целое число N, порождает N дочерних процессов c использованием exec() (никакие параметры не передаются!) и ожидает от этих программ сообщения через канал, которые затем выводит на экран. Дочерние процессы также выводят на экран посылаемые сообщения.
3 Взаимодействие процессов через FIFO
3. 1 Используя программные задержки (и/или опцию O_NDELAY при открытии), получите
1) ошибку открытия FIFO в родительском процессе
2) чтение дочерним процессом 0 байт
3. 2 Разработайте программу, которая в зависимости от параметров запуска ведет себя как сервер или как клиент. Функции сервера считывать данные из FIFO и выводить их на экран. Функции клиента считывать данные от пользователя и передавать их через FIFO.
Указания к выполнению работы: Карпов В.Е., Коньков К.А. Основы операционных систем, с. 335-357 (Семинар 5).
При защите лабораторной работы предоставляется отчет и демонстрируется работа всех программ.