3. Переназначение операций ввода-вывода
Каждый создаваемый процесс имеет доступ к стандартным портам ввода-вывода.
|
Ввод |
Вывод |
|
FILE * |
stdin |
stdout |
stderr |
дескриптор |
0 |
1 |
2 |
связан с |
клавиатурой |
дисплеем |
дисплеем |
Каждый стандартный порт может быть переназначен в файл или канал, посредством функций dup2.
int dup2 (int fd, int fd2)
Функция делает fd2 копией дескриптора fd.
Таким образом, можно переназначить стандартный вывод в канал, посредством выполнения функции dup2(fd[1], 1), где fd[1] – дескриптор для записи в канал.
Также можно переназначить стандартный ввод из канала, посредством выполнения функции dup2(fd[0], 0), где fd[0] – дескриптор для чтения из канала.
4. Цели и задачи
Научиться использовать каналы для организации взаимодействия процессов и их синхронизации. Изучить переназначение операций ввода-вывода.
5. Порядок выполнения лабораторной работы
1. Разработать алгоритм решения задания а, с учетом разделения вычислений между несколькими процессами. Для обмена информацией между процессами использовать неименованные каналы.
2. Реализовать алгоритм решения задания а и протестировать на нескольких примерах.
3. Разработать алгоритм решения задания б, разделив вычисления между несколькими приложениями. Для обмена информацией между приложениями использовать именованные каналы.
4. Реализовать алгоритм решения задания б и протестировать на нескольких примерах.
6. Варианты заданий (1-15)
1.
а) В массиве А заменить положительные элементы нулями, а отрицательные элементы единицами. Определить число вхождений в массиве нулей или единиц по указанию пользователя в начале работы программы. Входные данные: целое положительное число n, массив чисел А размерности n, целое положительное число к ≥ 2 и ≤ n/2, поиск нулей или единиц. Использовать для решения задачи к процессов.
б) Первое приложение запрашивает у пользователя число и отсылает его второму приложению, второе приложение умножает полученное число на два и отсылает его третьему приложению, третье приложение выводит полученное число на экран.
2.
а) Найти максимальный по модулю элемент в двумерной матрице А и его индексы – х, у. Входные данные: целое положительное число n, массив чисел А размерности nxn. Использовать четыре процесса, разделив между ними массив.
б) Первое приложение запрашивает у пользователя количество чисел и сами числа и отсылает его второму приложению, которое выводит максимальное четное число из полученных или отображает, что такого числа нет.
3.
а) Строка содержит произвольный текст. Вывести сколько раз в ней встречается цифра 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Найти две наиболее часто встречающиеся цифры. Входные данные: строка S. Использовать 10 процессов.
б) Первое приложение считывает из файла матрицу размерности 4х4 и отсылает ее второму приложению, которое вычисляет и выводит суммы всех строк и столбцов.
4.
а) Строка содержит произвольный текст. Вывести сколько раз в ней встречаются буквы английского алфавита – a, b, c, d и т.д. Входные данные: строка S.
б) Первое и второе приложение ожидают ввода строки пользователем и отсылают строки третьему приложению, которое определяет, какая строка длиннее и находит все символы, содержащиеся в обеих строках.
5.
а) Двоичные числа записаны в строке, разделителем является пробел. Найти сумму всех двоичных чисел как десятичное число. Входные данные: строка S. Для решения задачи использовать два процесса.
б) Первое приложение запрашивает у пользователя строку, второе приложение запрашивает у пользователя пару символов (a, b), третье приложение получает эти данные и заменяет в строке символ a на символ b.
6.
а) Вычислить произведение матрицы А на В, где матрица В получена из матрицы А, заменой отрицательных элементов их модулями и последующим транспонированием. Входные данные: целое положительное число n, массив чисел А размерности nxn. Использовать n процессов.
б) Первое приложение запрашивает у пользователя количество чисел и сами числа и отсылает их второму приложению, которое вычисляет сумму квадратов всех чисел.
7.
а) Найти сумму всех элементов в матрице А, сумма или разность индексов которых по модулю является простым числом. Входные данные: целое положительное число n, целое положительное число к, массив чисел от А размерности nxк.
б) Первое и второе приложению запрашивают у пользователя символ и отсылают полученный символ друг другу, каждое приложение отвечает на вопрос, совпадают ли символы.
8.
а) В массиве строк хранятся фамилии и оценки учащихся. Найти всех учащихся с минимальным средним баллом. Число оценок у различных учащихся может быть не одинаково. Входные данные: целое положительное число n, массив строк размерности n. Использовать n или n+1 процессов для решения задачи.
б) Первое и второе приложению запрашивают у пользователя число и отсылают полученные числа друг другу, если числа оказались не равны, действия повторяются сначала и т.д., пока введенная пара чисел не окажется одинаковой.
9.
а) Упорядочить по возрастанию элементы в каждом столбце матрицы А. Входные данные: целое положительное число n, целое положительное число к, массив чисел от А размерности nxк. Использовать к или к+1 процессов для решения задачи.
б) Первое приложение запрашивает у пользователя три коэффициента, второе считывает из файла три коэффициента, оба приложения отсылают коэффициенты третьему приложению, которое вычисляет решение системы {Ax+By+C=0 ; Dx+Ey+F=0}.
10.
а) В матрице А для каждой строки определить – стоит ли наибольший элемент строки на главной диагонали. Входные данные: целое положительное число n, массив чисел А размерности nxn. Использовать n или n+1 процессов для решения задачи.
б) Первое приложение запрашивает у пользователя число и отсылает его второму приложению, второе приложение запрашивает у пользователя число и отсылает его первому приложению, первое приложение определяет какое из чисел минимальное, второе приложение определяет какое из чисел максимальное.
11.
а) Определить является ли матрица А симметричной относительно побочной диагонали. Входные данные: целое положительное число n, массив чисел А размерности nxn.
б) Первое приложение считывает из файла произвольное количество чисел и отсылает их второму приложению, которое выводит на экран только простые числа из полученных.
12.
а) Найти пару максимальных значений среди тех элементов матрицы А, сумма индексов которых равна двойке в любой целочисленной степени. Входные данные: целое положительное число n, массив чисел от А размерности nxn.
б) Первое приложение считывает из файла десять чисел и отсылает их второму приложению, которое выводит на экран только те числа из полученных, которые являются квадратами произвольных натуральных чисел, затем отсылает эти числа первому приложению, которое также отображает их на экране. Учесть ситуацию, когда ни одно число не удовлетворяет условию.
13.
а) Найти сумму всех седловых точек матрицы А. Будем считать, элемент седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце. Входные данные: целое положительное число n, массив чисел А размерности nxn.
б) Третье приложение отсылает натуральное число n первому и второму приложению. Первое приложение отсылает третьему коэффициенты а1, а2, … an, второе приложение отсылает третьему коэффициенты b1, b2, … bn, третье приложение вычисляет (а1-b1)*(а1-b1)+(а2-b2)*(а2-b2)+…+(аn-bn)*(аn-bn).
14.
а) Определить максимальное число, являющееся квадратом некоторого целого числа, в матрице А. Входные данные: целое положительное число n, массив чисел А размерности nxn.
б) Первое приложение считывает из файла произвольное количество чисел и отсылает их второму приложению, которое отсылает назад первому приложению число нечетных чисел из полученных. Первое приложение определяет, сколько чисел в файле меньше чем число, полученное от второго приложения.
15.
а) Составить текстовую строку из максимальных четных элементов столбцов матрицы А. Входные данные: целое положительное число n, целое положительное число к, массив чисел А размерности nxк. Использовать для решения задачи число процессов, равное числу столбцов.
б) Первое приложение отсылает число второму приложению, которое вычисляет корень числа и отсылает его третьему приложению, третье приложение также вычисляет корень от полученного значения и отсылает результат первому приложению, которое выводит результат на экран.
