Форсирование записи данных на диск — КиберПедия 

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

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

Форсирование записи данных на диск

2021-01-29 87
Форсирование записи данных на диск 0.00 из 5.00 0 оценок
Заказать работу

 

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

Со слегка более высоким уровнем риска мы можем сами испечь свое пирожное и съесть его. Это осуществляется путем открытия файла без указания флагов x, но с последующим использованием одного из следующих двух системных вызовов в любой момент, когда это необходимо для безопасного перемещения данных на физический носитель:

 

 

Системный вызов подобен: он форсирует запись данных на конечное физическое устройство. Системный вызов подобен, форсируя запись на физическое устройство не только данных файла, но и вспомогательных данных. Вызов более переносим; он существовал в мире Unix в течение более продолжительного времени, и вероятность его наличия среди широкого ряда систем больше.

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

 

 

Технически оба этих вызова являются расширениями базового стандарта POSIX: в расширении «Синхронизация файлов» (FSC), a в расширении «Синхронизированный ввод и вывод». Тем не менее, можно без проблем использовать их в системе GNU/Linux

 

Установка длины файла

 

Два системных вызова позволяют настраивать размер файла:

 

Как должно быть очевидно из параметров, принимает аргумент имени файла, тогда как работает с дескриптором открытого файла. (Обычным является соглашение по именованию пар системных вызовов xxx() и fxxxx(), работающих с именами файлов и дескрипторами файлов. Мы увидим несколько примеров в данной и последующих главах.) В обоих случаях аргумент является новым размером файла.

Этот системный вызов происходит от 4.2 BSD Unix, и на ранних системах мог использоваться лишь для сокращения длины файла, отсюда и название. (Он был создан, чтобы облегчить реализацию операции урезания в Фортране.) На современных системах, включая Linux, имя является неправильным, поскольку с помощью этих вызовов можно также увеличить, а не только сократить длину файла. (Однако, POSIX указывает, что возможность увеличения размера файла относится к расширению XSI.)

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

Эти вызовы сильно отличаются от '', который полностью урезает файл, отбрасывая все его данные. Эти же вызовы просто устанавливают абсолютную длину файла в данное значение.

Эти функции довольно специализированы; они используются лишь четыре раза во всем коде GNU Coreutils. Мы представляем пример использования в разделе 5.5.3 «Изменение отметок времени:».

 

Резюме

 

• Когда системный вызов завершается неудачей, он обычно возвращает ‑1, а в глобальной переменной errno устанавливается предопределенное значение, указывающее на проблему. Для сообщений об ошибках могут использоваться функции и.

• Доступ к файлам осуществляется через небольшие целые, которые называются дескрипторами. Дескрипторы файлов для стандартного ввода, стандартного вывода и стандартной ошибки наследуются от родительского процесса программы. Другие получаются через или. Для их закрытия используется, a возвращает разрешенное максимальное число открытых файлов. Значение (устанавливаемое с помощью) влияет на права доступа, получаемые новыми файлами при создании с помощью или с флагом для.

• Системные вызовы и соответственно читают и записывают данные. Их интерфейс прост. В частности, они не интерпретируют данные, файлы представлены линейными потоками байтов. Системный вызов осуществляет ввод/выводе произвольным доступом: возможность перемещаться внутри файла.

• Для синхронного ввода/вывода предусмотрены дополнительные флаги для, при этом данные записываются на физический носитель данных до возвращения или. Можно также форсировать запись данных на диск на управляемой основе с помощью или.

• Системные вызовы и устанавливают абсолютную длину файла. (На более старых системах они могут использоваться лишь для сокращения длины файла; на современных системах они могут также увеличивать файл.)

 

Упражнения

 

1. Используя лишь, и, напишите простую программу, которая копирует файл, имя которого дается в первом аргументе, в файл с именем во втором аргументе.

2. Усовершенствуйте программу так, чтобы она принимала "" в значении «стандартный ввод» при использовании в качестве первого аргумента и в значении «стандартный вывод» в качестве второго аргумента. Правильно ли работает ''?

3. Просмотрите страничку справки для proc (5) на системе GNU/Linux. В частности, посмотрите подраздел. Выполните '' и непосредственно проверьте файлы в. Если бы и дружественные устройства были бы в ранних версиях Unix, как это упростило бы код для программы V7? (Во многих других современных системах Unix есть каталог или файловая система. Если вы не используете GNU/Linux, посмотрите, что вы можете обнаружить в своей версии Unix.)

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

5. (Простое) Предположив наличие, напишите свою версию.

6. Каков результат выполнения '' на вашей системе?

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

Откомпилируйте и запустите, затем проверьте значение с помощью стандартной команды. Объясните результаты. (Подсказка: в оболочке Bash введите ''.)

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

9. Мы сказали, что для файл должен быть открыт для записи. Как можно открыть файл для записи, когда у самого файла нет доступа записи?

10. Напишите программу, которая используется следующим образом: ' длина_файла '.

 

 

Глава 5


Поделиться с друзьями:

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.