Конвейер, перенаправление ввода-вывода 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Конвейер, перенаправление ввода-вывода



 

8.18. Написать программу, моделирующую команду SHELL: (здесь pri - имена процессов, argj - аргументы процессов, f.dat - файл входных данных, f.res - файл результатов; в каждом из процессов pri использован стандартный ввод-вывод). Аргументы, необходимые этой программе, задаются в командной строке.

a) pr1 | pr2 | pr3

b) pr1 | pr2 > f.res

c) pr1 arg11 arg12 < f.dat | pr2 arg21 agr22

d) pr1 < f.dat > f.res

e) pr1 < f.dat | pr2 | pr3 > f.res

f) pr1 | pr2 >> f.res

g) pr1; pr2 | pr3 > f.res

h) ((pr1 | pr2); pr3) | pr4

i) pr1 arg1 < f.dat; pr2 | pr3 >>f.res

j) pr1 arg1 < f.dat | pr2 | pr3 >f.res &

k) pr1 arg1 > f.res; pr2 | pr3 >> f.res

l) pr1 < f.dat | pr2 arg2; pr3 > f.res

m) pr1; pr2;...; prn

n) pr1; pr2;...; prn &

o) pr1 | pr2 |... | prn

p) pr1 | pr2 |... | prn &

 

8.19. Написать программу, моделирующую команду SHELL pr1&&pr2 (выполнить pr1; в случае успешного завершения pr1 выполнить pr2, иначе завершить работу). Имена процессов задаются в командной строке.

 

8.20. Написать программу, моделирующую команду SHELL pr1 || pr2
(выполнить pr1; в случае неудачного завершения pr1 выполнить pr2, иначе завершить работу). Имена процессов задаются в командной строке.

 

8.21. Написать программу, моделирующую выполнение команды (pr1;pr2) | pr3 > f.res (конкатенация результатов работы процессов pr1 и pr2 передается в качестве входных данных процессу pr3; результаты его работы перенаправляются в файл f.res; в процессах pr1, pr2 и pr3 использован стандартный ввод-вывод).

a) аргументы задаются в командной строке в виде pr1 pr2 pr3 f.res

b) команда (pr1;pr2) | pr3>f.res вводится как строка во время работы программы.

Подсказка: для разбиения строки на лексемы удобно использовать функцию strtok из <string.h>

 

8.22. Написать программу, реализующую конвейер из n процессов. Информация, необходимая для запуска каждого процесса, задается в командной строке: имя_процесса количество_аргументов аргументы

Например, pr1 3 a1 a2 a3 pr2 0 pr3 2 b1 b2 означает, что программа должна выполнить команду pr1 a1 a2 a3 | pr2 | pr3 b1 b2.

 

8.23. Пусть есть исполняемый файл exp_x со стандартным вводом-выводом, вычисляющий значение exp(x). Результат работы exp_x - значения x и exp(x). Написать программу, использующую этот файл для нахождения таблицы значений exp(xi) на отрезке [a,b] в точках xi=a+i*h, i = 0, 1,..., n; h = (b-a)/n. Значения a, b и n вводятся с клавиатуры. Таблица выводится в стандартный поток вывода.

 

8.24. Пусть есть исполняемый файл func со стандартным вводом-выводом, вычисляющий значение функции f в точке x. Результат работы - значения x и f(x). Написать программу, использующую этот файл для нахождения таблицы значений f(x) на отрезке [a,b] в точках xi =a+i*h, i = 0,1,...,n; h = (b-a)/n. Значения a, b и n задаются в командной строке. Таблица записывается в файл f.tab.

 

8.25. Пусть есть исполняемый файл modify, который удаляет в текстовом файле все четные строки (строки нумеруются с единицы; пустые строки тоже анализируются). Имя файла задается в командной строке при вызове modify. Написать программу, использующую modify для обработки файлов, имена которых задаются в командной строке. Если первая строка файла совпадает со второй его строкой, то в файле оставить только нечетные строки; иначе файл не изменять. Анализ файлов выполняет основной процесс, изменения в фоновом режиме осуществляет modify (для каждого файла – свой экземпляр modify).

 

8.26. Пусть есть исполняемый файл modify, который удаляет в текстовом файле все четные строки (строки нумеруются с единицы; пустые строки тоже анализируются). Имя файла задается в командной строке при вызове modify. Написать программу, использующую modify для обработки файлов, имена которых задаются в командной строке. Если после сортировки файла, состоящего из нечетных строк исходного файла, оказалось, что каждая очередная строка начинается со следующей по алфавиту буквы (начиная с буквы ‘a’ до буквы ‘z’ и далее циклически), то имя этого файла выдать на экран, иначе - файл удалить. Для сортировки использовать команду sort.

 

8.27. Написать программу, определяющую количество литер, слов и строк в тексте, состоящем из нечетных N-ок байт заданного файла. Для подсчета количества литер, слов и строк использовать команду wc. Результаты поместить в файл. Имена файлов и величина N задаются в командной строке.

 

8.28. Написать программу, сортирующую по алфавиту строки текста, состоящего из четных строк данного файла. Для сортировки использовать команду sort. Результаты сортировки поместить в файл. Имена файлов задаются в командной строке.

 

8.29. Написать программу, определяющую количество литер, слов и строк в тексте, состоящем из тех строк заданного файла, которые содержат данную строку-шаблон в качестве подстроки. Используйте команды wc и grep. Результаты поместить в файл. Имена файлов и строка-шаблон задаются в командной строке.

 

8.30. Написать программу, которая выводит на экран имена файлов fk, содержащих не менее nk строк, включающих заданную строку strk в качестве подстроки. Имена файлов fk, величины nk и строки-шаблоны strk задаются в командной строке в виде f1 n1 str1 f2 n2 str2... fk nk strk. Использовать команды grep и wc.

 

8.31. Пусть есть исполняемый файл file_dbl, который удваивает в обрабатываемом файле каждую очередную порцию из 128 байт. Имя файла задаётся в командной строке при запуске file_dbl. Написать программу, использующую file_dbl для обработки файлов, имена которых задаются в командной строке. Если длина файла меньше 1024 байт, то увеличить его размер с помощью file_dbl, иначе оставить без изменения. Анализ файлов выполняет основной процесс, изменения в фоновом режиме осуществляет file_dbl (для каждого файла свой экземпляр file_dbl).

 

8.32. Пусть файл содержит текст и команды форматирования. Эти команды располагаются на отдельных строках и начинаются символами ./. Написать программу для подсчета символов в тексте (без учета символов форматирующих команд). Головной процесс анализирует содержимое файла и передает вспомогательному процессу текст без форматирующих команд. Вспомогательный процесс подсчитывает количество символов в получаемом тексте и возвращает полученный результат головному процессу. Имя файла головной процесс получает из командной строки.

 

8.33. Что делает программа?

 

#include <stdio.h>

void Start (char *name, int in, int out)

{ if (fork() == 0)

{ dup2(in,0);

dup2(out,1);

close(in); close(out);

execlp(name,name,0);

}

}

main(int argc, char *argv[])

{ int i, fd[2], in=0, out;

for (i = 1; i < argc-1; i++)

{ pipe(fd); out=fd[1];

Start(argv[i], in, out);

close(in); close(out);

in = fd[0];

}

out = 1;

Start(argv[ i ], in, out);

}

 

Сигналы. Фоновые процессы.

 

8.34. Написать программу игры в "пинг-понг" двух процессов через два канала. Первый процесс посылает второму 1, второй первому – 2, первый второму – 3, второй первому – 4 и т.д. Игра завершается при нажатии клавиш Ctrl+C.

 

8.35. Написать программу игры в "пинг-понг" двух процессов (см. предыдущую задачу) через один канал. Для синхронизации использовать сигнал. Игра завершается при нажатии клавиш Ctrl+C.

 

8.36. Написать программу игры в "волейбол" трех процессов: первый посылает второму "1", второй третьему - "2", третий первому - "3", первый второму - "4" и т.д. Игра завершается при нажатии клавиш Ctrl+C. Работу процессов синхронизировать с помощью сигналов.

 

8.37. Написать программу игры в "волейбол" трех процессов (см. предыдущую задачу). Игра завершается при нажатии клавиш Ctrl+C. Работу процессов синхронизировать с помощью канального чтения.

 

8.38. Написать программу игры одного процесса с двумя другими: первый процесс посылает второму 1, затем третьему 'a'; после этого он получает от второго 2, затем от третьего - 'b.' На следующем шаге первый посылает второму 3, третьему - 'c'; получает от второго 4, от третьего - 'd' и т.д. именно в такой последовательности с увеличением числа и изменением символа от 'a' до 'z' циклически. Игра завершается при нажатии клавиш Ctrl+C. Для синхронизации использовать сигналы.

 

8.39. Написать программу, определяющую самую длинную строку в заданном файле. Если таких строк несколько, то в качестве результата выдать первую из них. Обеспечить возможность работы программы в фоновом режиме и в обычном (с обработкой прерываний по Ctrl+C: при каждом нажатии этих клавиш программа должна выдавать промежуточный результат - самую длинную из уже просмотренных строк). Имя файла задается в командной строке.

 

8.40. Написать программу, заполняющую файл N строками. Аргументы
(имя файла, количество строк N и строка-заполнитель) задаются в командной строке. Обеспечить возможность работы программы в фоновом режиме и в обычном (с обработкой прерываний по Ctrl+C: при каждом нажатии этих клавиш программа должна выдавать промежуточный результат - количество строк, записанных в файл к этому моменту).

 

8.41. В файле записана непустая последовательность целых чисел (целое число – это непустая последовательность десятичных цифр, возможно начинающаяся знаком + или -). Написать программу для нахождения наибольшего из этих чисел. Во время ее работы каждую секунду выдается промежуточный результат - наибольшее из уже просмотренных чисел. Имя файла задается в командной строке.

 

8.42. Даны два файла, строки в которых упорядочены по алфавиту. Написать программу, осуществляющую слияние этих двух файлов в третий, строки которого тоже упорядочены по алфавиту. Имена всех трех файлов задаются в командной строке. Обеспечить возможность работы программы в фоновом и в обычном режиме (с обработкой прерываний по Ctrl+C: первое нажатие этих клавиш не влияет на работу программы; все последующие нажатия вызывают печать количества литер, слов и строк в частично сформированном файле-результате. Для подсчета количества литер, слов и строк использовать команду wc).

 

8.43. Написать программу слияния двух файлов в третий. Файл -результат формируется чередованием N-ок символов первого и второго файлов (если один из файлов длиннее другого, то его оставшаяся часть приписывается в конец файла-результата). Имена файлов и величина N задаются в командной строке. Исходные файлы читаются разными процессами; эти же процессы по очереди записывают по N байт из обрабатываемых ими файлов в файл-результат. Синхронизацию их работы организовать с помощью сигналов.

 

8.44. Написать программу нахождения корня уравнения f(x) = 0 с точностью eps > 0 на некотором отрезке [a,b] (любым известным Вам методом: деления отрезка пополам, хорд, касательных, комбинированным), которая после каждого нажатия клавиш Ctrl+C выдает очередное приближение и запрос о дальнейших действиях:

C - продолжать вычисления;

A - закончить работу программы;

R - начать поиск корня этого же уравнения на другом отрезке (новые значения a и b вводятся с клавиатуры).

Затем выполняет эти действия. Если корень был найден (с заданной точностью eps) до нажатия клавиш Ctrl+C, то выдается соответствующее сообщение, печатается результат и программа прекращает работу.

 

8.45. Написать программу вычисления определенного интеграла функции f(x) на отрезке [a,b] с точностью eps (любым известным Вам методом: прямоугольников, трапеций, Симпсона), которая при возникновении сигнала SIGFPE (арифметическая ошибка: деление на 0 или переполнение) выдает значение частичной суммы, количество точек разбиения и запрос о дальнейших действиях:

A - закончить работу программы;

R - вычислять значение интеграла на другом отрезке (новые значения a и b вводятся с клавиатуры; реакция на сигнал SIGFPE сохраняется).

Затем выполняет эти действия. Если вычисление интеграла (с заданной точностью) успешно завершилось, то выдается соответствующее сообщение, печатается результат и программа прекращает работу.

 

8.46. Написать программу копирования содержимого одного файла в другой. Копирование осуществляет вспомогательный процесс. Если во время копирования считывается строка, длина которой больше N, то этот процесс сообщает процессу-родителю о возникшей ситуации. Головной процесс спрашивает пользователя о том, что делать с этой строкой:

D - не записывать строку в формируемый файл

C - записать только первые N символов

A - прекратить копирование

и сообщает вспомогательному процессу о принятом пользователем решении. Головной процесс ждет, когда вспомогательный закончит свою работу, сообщает пользователю о том, что копирование завершено и завершается сам. Имена файлов и величина N задаются в командной строке.

 

8.47. Написать программу копирования из одного файла в другой только тех восьмерок байт, в которых первый символ равен заданному. Использовать низкоуровневый ввод/вывод. Все аргументы (файлы и символ) задаются в командной строке. Программа в ответ на первые два нажатия клавиш Ctrl+C выдает количество восьмерок байт, записанных в файл-результат к этому моменту, после третьего нажатия - прекращает работу, выдав содержимое сформированного к этому моменту файла. Если не было третьего (второго, первого) Ctrl+C, то работа продолжается до тех пор, пока не будет проанализирован исходный файл и создан файл-результат.

 

8.48. Написать программу, выдающую на экран содержимое файла порциями по N строк: каждая последующая порция выдается после нажатия клавиш Ctrl+C. Имя файла и величина N задаются в командной строке.

 

 

ЗАДАНИЯ ПРАКТИКУМА

Свойства транслятора

 

1. Выяснить, сколько байт отведено для хранения данных типа short, int, long, float, double и long double.

 

2. Выяснить способ представления типа char: signed- или unsigned- вариант.

3. Проконтролировать, все ли способы записи констант допустимы:

· целых (обычная форма записи, u/U, l/L, их комбинации, восьмеричная и шестнадцатиричная системы счисления)

· вещественных (обычная форма записи, в экспоненциальном виде, f/F, l/L, e/E)

· символьных и строковых (в частности, происходит ли конкатенация рядом расположенных строковых констант)

 

4. Выяснить, как упорядочены коды символов '0'-'9', 'a'-'z', 'A'- 'Z', пробел (между собой и относительно друг друга).

 

5. Проверить наличие и качество диагностических сообщений при неверной записи констант:

· целых и вещественных

· символьных и строковых

 

6. Проконтролировать, допускается ли инициализация переменных при описании; происходит ли инициализация по умолчанию.

 

7. Проверить, реагирует ли компилятор на попытку изменить константу (внешнюю, автоматическую, статическую; арифметических типов, строковую).

 

8. Исследовать особенности выполнения операции % с отрицательными операндами.

 

9. Проверьте, действительно ли операции отношения == и!= имеют более низкий приоритет, чем все другие операции отношения.

 

10. Проверьте, выполняется ли правило "ленивых вычислений" выражений в Си, т.е. прекращается ли вычисление выражений с логическими операциями, если возможно "досрочно" установить значение результата.

 

11. Проверьте, все ли виды операнда операции sizeof, определяемые стандартом для арифметических типов, допускаются компилятором; действительно ли аргумент-выражение не вычисляется.

 

12. Определите, каким образом "малое" целое расширяется до int (старшие разряды int заполняются нулями или знаковым разрядом "малого" целого).

 

13. Определите, каким образом расширяются unsigned- варианты "малых" целых (до unsigned int как в "классическом" Си или сначала делается попытка расширить до int, и только в случае неудачи - до unsigned int).

 

14. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых
(M-битовое представление) к знаковым целым (N-битовое представление) при M > N, M = N, M < N.

 

15. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
(M-битовое представление) к знаковым целым (N-битовое представление) при M > N, M = N, M < N.

 

16. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел (X) к знаковым целым (N-битовое представление) при | X | < 2N-1, | X | >= 2N-1.

 

17. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых X
(M-битовое представление) к беззнаковым целым (N-битовое представление) при M > N, M = N, M < N; X >= 0, X < 0.

 

18. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
(M-битовое представление) к беззнаковым целым (N-битовое представление) при M > N, M = N, M < N.

 

19. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел (X) к беззнаковым целым (N-битовое представление) при 0<=X< 2N, X < 0, X >= 2N.

 

Калькулятор

 

Калькулятор – это программа, вычисляющая значения выражений, вводимых с клавиатуры. Ввод выражений и значений переменных, входящих в выражение, осуществляется по запросу программы.

Требуется контролировать правильность записи выражений. Минимальный набор диагностических сообщений:

- нарушен баланс скобок (с указанием – открывающих / закрывающих)

- отсутствует операнд

- пропущена операция

- недопустимая операция

- неверный операнд (ошибочно записана константа или имя переменной).

Выражение содержит знаки операций +, -,*, /; круглые скобки без ограничения уровней вложенности; операнды – константы (целые и вещественные) и переменные. Имя переменной – идентификатор, его максимальная длина – 6 символов; в вещественных константах порядок не используется, т.е. числа имеют вид целая_часть. дробная_часть, где либо одно, либо другое может быть опущено. Целочисленные константы записываются в десятичной форме (восьмеричное и шестнадцатиричное представление не используется).

Старшинство операций и правила приведения типов аналогичны правилам Си. Тип переменной определяется по виду константы – инициализатора.

 

Некоторые рекомендации:

- если синтаксический анализ реализован методом рекурсивного спуска, то для выхода из «глубокой» рекурсии удобны функции setjmp и longjmp.

- в функции метода рекурсивного спуска можно вставить действия по переводу анализируемого выражения в польскую инверсную запись (ПОЛИЗ). Это позволит за один просмотр провести анализ исходного выражения и генерацию его польской записи; при использовании алгоритма Дейкстры может потребоваться еще один просмотр.

- выражения в ПОЛИЗе можно интерпретировать многократно при разных значениях переменных (если пользователь потребует этого в процессе диалога).

- таблицу переменных удобно представлять с использованием объединений, т.к. для переменных разных типов придется хранить значения типа int и типа double.

Приведенный здесь вариант калькулятора можно упростить: реализовать только целочисленную либо только вещественную арифметику.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 397; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.122.195 (0.06 с.)