Моделирование работы интерпретатора SHELL 


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



ЗНАЕТЕ ЛИ ВЫ?

Моделирование работы интерпретатора SHELL



(программа My_Shell)

 

Входной язык: подмножество командного языка SHELL (определяется вариантом).

Поток команд:

1. командный файл, т.е. каждая строка файла - это отдельная команда, которая должна быть выполнена интерпретатором (имя файла - аргумент в командной строке при вызове интерпретатора);

2. стандартный входной поток команд;

3. для исполнения каждой команды требуется запуск программы My_Shell.

 

ВНИМАНИЕ!!! "побочный" эффект выполнения уже обработанных команд (например, перенаправление ввода-вывода) не должен влиять на выполнение последующих команд.

 

Входной язык (варианты):

Общая часть (одинаковая для всех вариантов):

· # конвейер pr1 | pr2 |... | prN для произвольного N>=2; считать, что аргументов у prI (1 <= I<= N) нет (но возможна реализация с произвольным числом аргументов у каждого процесса)

 

· # перенаправление ввода-вывода <, >, >> (в том числе для pr1 и prN в конвейере)

Например, pr < data > res

pr1 | pr2 > res.txt

 

· # запуск в фоновом режиме & (в том числе и для конвейеров)

Например, pr arg1 arg2 &

pr1 | pr2 | pr3 > res.all &

 

Вариантная часть:

В каждый вариант входит (как минимум) один из подпунктов каждого пункта, отмеченного римской цифрой. Звездочкой отмечены более сложные подпункты. Части подпунктов, содержащие слово «возможно», могут быть опущены при выборе варианта; их реализация усложняет вариант. Вариант определяет преподаватель.

 

I. 1. mv old_file new_file

2. cp file copy_file

 

II. 1. wc filename

результат: filename строк слов символов (возможен список имен файлов; в этом случае подобная информация выдаются о каждом файле)

2. grep substring filename

результат: строки файла filename, содержащие substring как подстроку (возможен флаг -v; в этом случае результат - это строки, которые не содержат substring как подстроку)

3. cmp filename1 filename2

результат: информация о первом различии в содержимом двух файлов

Например, filename1 differs from filename2: line 5 char 36

*4. sort filename

сортировка строк файла в соответствии с кодировкой ASCII

возможны флаги:

-r обратный порядок

-f не различать большие и малые буквы

-n числовой порядок

+n начать сортировку с (n+1)-ой строки

 

III. 1. cat filenames

возможен флаг:

-n с нумерацией строк (если файлов несколько, то нумерация сквозная)

2. tail filename

вывод 10 последних строк файла

возможны флаги:

-n n последних строк

+n с n-ой строки и до конца файла

3. od filename

вывод содержимого файла по 10 символов в строке с указанием номера первого символа в каждой десятке

Например, 000001 a b c d \n e f g h i

000011 j k \t l m n

возможен флаг:

-b с указанием восьмеричных кодов символов

 

IV. 1. pr1; pr2;...; prN

последовательное выполнение команд prI - как если бы они были переданы интерпретатору по одной команде в строке

ВНИМАНИЕ!!! приоритет операции | выше, чем приоритет операции; однако, возможно использование скобок: напрмер, (pr1; pr2) | pr3, что приведет к конкатенации результатов работы pr1 и pr2, которые будут переданы процессу pr3 как входные данные.

2. pr1 && pr2

выполнить pr1; в случае успеха выполнить pr2

3. pr1 || pr2

выполнить pr1; в случае неудачи выполнить pr2


 

ПРИЛОЖЕНИЯ

 

Библиотека стандартных функций языка С

 

Здесь приводится краткое описание некоторых библиотечных функций, утвержденных в качестве ANSI-стандарта языка Cи. Более подробное и полное описание этой библиотеки можно найти в [1] и [2].

 

Функции работы со строками

Эти функции определены в головном файле <string.h>. Если копирование имеет дело с объектами, перекрывающимися по памяти, то поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char.

 

char *strcpy(char *s, const char *ct)

копирует строку ct в строку s, включая ‘\0’; возвращает s.

 

char *strcat (char *s, const char *ct)

приписывает ct к s; возвращает s.

 

char strcmp(const char *cs, const char *ct)

сравнивает cs с ct; возвращает значение меньшее 0, если cs<ct; равное 0, если cs==ct, и большее 0,если cs>ct.

 

char *strchr(const char *cs, char c)

возвращает указатель на первое вхождение c в cs или, если такового не оказалось, NULL.

 

char *strrchr(const char *cs, char c)

возвращает указатель на последнее вхождение c в cs или, если такового не оказалось, NULL.

 

char *strstr(const char *cs, const char *ct)

возвращает указатель на первое вхождение ct в cs или, если такового не оказалось, NULL.

 

size_t strlen(const char *cs)

возвращает длину cs (без учета ‘\0’).

 

char *strtok(char *s, const char *ct)

ищет в s лексему, ограниченную литерами из ct.

Последовательные вызовы функции strtok разбивают строку s на лексемы. Ограничителем лексемы может быть любая литера, входящая в строку ct. В первом вызове функции указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из литер, не входящих в ct; работа этого вызова завершается тем, что поверх следующей литеры пишется ‘\0’ и возвращается указатель на выделенную лексему. Каждый последующий вызов функции strtok, в котором указатель s равен NULL, выдает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.

 

void *memcpy(void *s, const void *ct, size_t n)

копирует n литер из ct в s и возвращает s.

 

void *memset(void *s, char c, size_t n)

размещает литеру c в первых n позициях строки s и возвращает s.

 

 



Поделиться:


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

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