(c) Larry Ewing, Simon Budig, Garrett LeSage
с 1994 г.

Кафедра Информатики и Математического Обеспечения

ПетрГУ | ИМиИТ | О кафедре | Мобильные платформы | Лаборатория ИТС | Семинары НФИ/AMICT
Сотрудники | Выпускники | Учебный процесс | Табель-календарь | Курсовые и выпускные работы
Вычислительные ресурсы | Публикации | Архив новостей | Контактная информация

Упражнение 2.1

Создайте небольшую программу, описанную выше. Проверьте ее работу при условии, что файл junk не существует. Затем создайте файл junk с помощью текстового редактора и снова запустите программу. Содержимое файла junk не имеет значения.

Упражнение 2.2

Интересно, что файл O_TRUNC может использоваться и без флага O_CREAT. Попытайтесь предугадать, что при этом получится, а затем проверьте это при помощи программы в случаях, когда файл существует и не существует.

Упражнение 2.3

Напишите небольшую программу, которая сначала создает файл при помощи вызова creat, затем, не вызывая close, сразу же открывает его при помощи системного вызова open для чтения в одном случае и для записи в другом. В обоих случаях выведите сообщение об успешном или неуспешном завершении.

Упражнение 2.4

Если вы знаете, как это сделать, перепишите программу count так, чтобы вместо использования постоянного имени файла она принимала его в качестве аргумента командной строки. Проверьте работу программы на небольшом файле, состоящем из нескольких строк.

Упражнение 2.5

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

Упражнение 2.6

Измените функцию copyfile так, чтобы в качестве ее параметров могли выступать дескрипторы, а не имена файлов. Проверьте работу новой версии программы.

Упражнение 2.7

Если вы умеете работать с аргументами командной строки, используйте одну из функций copyfile для создания программы mycp, копирующей первый заданный в командной строке файл во второй.

Упражнение 2.8

Напишите функцию, которая использует вызов lseek для получения размера открытого файла, не изменяя при этом значения указателя чтения-записи.

Упражнения 2.9-2.11 пропущены.

Упражнение 2.12

В качестве обобщенного примера напишите программу на основе системного вызова lseek, которая копирует в обратном порядке байты из одного файла в другой. Насколько эффективным получилось ваше решение ?

Упражнение 2.13

Используя вызов lseek, напишите процедуры для копирования последних 10 символов, последних 10 слов и последних 10 строк из одного файла в другой.

Упражнение 2.14

Напишите процедуру fileopen, имеющую два аргумента: первый - строку, содержащую имя файла, и второй - строку, которая может иметь одно из следующих значений:

процедура fileopen должна возвращать дескриптор файла или код ошибки -1.

Упражнение 2.15

Напишите версию программы io, которая проверяет наличие аргументов командной строки. Если существует хотя бы один из них, то программа должна рассматривать каждый из аргументов как имя файла и копировать содержимое каждого файла в стандартный вывод. Если аргументы командной строки отсутствуют, то ввод должен осуществляться из стандартного ввода. Как должна действовать программа io, если она не может открыть файл ?

Упражнение 2.16

Иногда данные в файле могут медленно накапливаться в течение продолжительного промежутка времени. Напишите версию программы io с именем watch, которая будет выполнять чтение из стандартного ввода до тех пор, пока не встретится символ конца файла, выводя данные на стандартный вывод. После достижения конца файла программа watch должна сделать паузу на пять секунд, а затем снова начать чтение стандартного ввода, чтобы проверить, не поступили ли новые данные, не открывая при этом файл заново и не изменяя положение указателя чтения-записи.

Для прекращения работы процесса на заданное время вы можете использовать стандартную библиотечную процедуру sleep, которая имеет единственный аргумент - целое число, задающее продолжительность ожидания в секундах. Например, вызов sleep(5); заставляет процесс прекратить работу на 5 секунд.

Программа watch аналогична программе readslow, существующей в некоторых версиях UNIX. посмотрите также в руководстве системы описание ключа -f команды tail.

Упражнение 2.17

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