Копирование дескрипторов файлов
Существуют следующие способы копирования дескрипторов файлов: функция или , функция и функция .
Функции dup и dup2
- Функция создает копию дескриптора файла. Копия создается в пустой строке пользовательской таблицы дескрипторов, содержащей исходный дескриптор. При вызове увеличивается значение счетчика обращений к файлу в записи таблицы открытых файлов и возвращается новый дескриптор файла.
- Функция находит запрошенный дескриптор и закрывает связанный с ним файл, если он открыт. С ее помощью можно указать конкретную запись таблицы, в которую должен быть скопирован дескриптор.
Функция fork
- Функция создает дочерний процесс, который наследует все дескрипторы файлов родительского процесса. После этого дочерний процесс запускает новый процесс. Унаследованные дескрипторы с флагом Закрыть при exec, установленным с помощью , будут закрыты.
Функция fcntl
- Функция позволяет работать со структурой данных о файле и с дескрипторами открытых файлов. Она позволяет выполнять следующие операции над дескрипторами:
- Копировать дескриптор файла (аналогично функции ).
- Получать или устанавливать значение флага Закрыть при exec.
- Выключать режим объединения дескрипторов в блоки.
- Включать режим добавления данных в конец файла (O_APPEND).
- Включать отправку процессам сигнала о разрешении ввода-вывода.
- Устанавливать и получать ИД процесса или группы процессов для отправки SIGIO.
- Закрывать все дескрипторы файлов.
Стандартные дескрипторы файлов
При запуске программы в оболочке открывается три дескриптора 0, 1 и 2. По умолчанию с ними связаны следующие файлы:
Стандартный ввод. | |
1 | Стандартный вывод. |
2 | Стандартный вывод сообщений об ошибках. |
Перечисленные дескрипторы файлов связаны с терминалом. Это означает, что при чтении данных из файла с дескриптором 0 программа получает ввод с терминала, а при записи данных в файлы с дескрипторами 1 и 2 они выводятся на терминал. При открытии других файлов дескрипторы присваиваются в порядке возрастания.
Если ввод-вывод перенаправляется с помощью операторов < (знак меньше) или > (знак больше), то стандартные дескрипторы связываются с другими файлами. Например, следующая команда связывает дескрипторы файлов 0 и 1 с необходимыми файлами (по умолчанию эти дескрипторы связаны с терминалом).
prog < FileX > FileY
В данном примере дескриптор 0 будет связан с файлом FileX, а дескриптор 1 — с файлом FileY. Дескриптор 2 не будет изменен. Программе достаточно знать, что дескриптор 0 представляет файл ввода, а дескрипторы 1 и 2 — файлы вывода. Информация о том, с какими конкретно файлами связаны эти дескрипторы, ей не нужна.
В следующем примере программы продемонстрировано перенаправление стандартного вывода:
#include <fcntl.h> #include <stdio.h> void redirect_stdout(char *); main() { printf("Hello world\n"); /* печать в стандартный вывод */ fflush(stdout); redirect_stdout("foo"); /*перенаправление стандартного вывода*/ printf("Hello to you too, foo\n"); /*печать в файл foo */ fflush(stdout); } void redirect_stdout(char *filename) { int fd; if ((fd = open(filename,O_CREAT|O_WRONLY,0666)) < ) /*открытие нового файла*/ { perror(filename); exit(1); } close(1); /*закрытие стандартного вывода */ if (dup(fd) !=1) /*присвоение новому дескриптору значения 1*/ { fprintf(stderr,"Unexpected dup failure\n"); exit(1); } close(fd); /*закрытие ненужного исходного fd*/ }
При получении запроса на дескриптор выделяется первый свободный дескриптор из таблицы дескрипторов (дескриптор с наименьшим номером). Однако с помощью функции файлу можно присвоить любой дескриптор.
Файловые дескрипторы
В операционных системах для работы с файлами к ним сначала нужно получить доступ. Это можно осуществить через файловый дескриптор. В данном примере он выполняет роль своего рода метки, которой обозначается процесс, создавший поток ввода-вывода.
Операционная система Windows позволяет обратиться к дескриптору с помощью функции CreateFile. Его можно в дальнейшем использовать при работе с требуемым файлом.
В Unix системах для файлового дескриптора используется цифровые обозначения. 0 — стандартный ввод процесса терминала, 1 — его вывод, 2 — поток диагностики. Помимо числовых представлений можно использовать символические константы, определённые спецификацией.
HTML
В языке разметки гипертекста, который применяется для создания статичных веб-страниц, дескрипторы — это не что иное, как тэги. В этой среде они выполняют роль меток, благодаря которым текст, размещённый между ними, отображается определенным способом. Таким образом и формируется дизайн и расположение элементов на странице.
Как правило, специфика языка определяет наличие открывающего дескриптора и закрывающего. Все, что между ними, подвержено изменению.
Дескриптор может иметь атрибуты, то есть определённые свойства. Их синтаксис выглядит так: имя атрибута = его значение.
Подчиняясь общей логике, дескрипторы в HTML представляют собой идентификационные метки объектов. С их помощью можно управлять внешним видом, взаимодействовать со страницей и присваивать ей особые значения.
Ошибка номер 1400
Данная проблема часто встречается в семействе операционных систем Windows. При её появлении вместе с ней может быть и краткое описание — недопустимый дескриптор окна. А может встречаться и такая формулировка — «Error_invalid_window_handle» или 0х578.
Как бороться и что значит неверный дескриптор? В зависимости от контекста объекта, нужно принимать разные меры.
В любом случае стоит сразу же пройтись по стандартным мерам, принимаемым ко всем проблемам с системой:
- перезагрузка компьютера;
- запуск и сканирование ошибки с помощью утилиты проверки целостности системных файлов;
- проверить компьютер на вирусы.
Если базовые шаги не помогли, то, возможно, стоит удалить и снова установить приложение, которое вызывает сбой.
Ещё один надёжный способ быстро восстановить работоспособность системы — сделать её откат с помощью стандартных инструментов. После использования «Восстановления системы», она вернётся к последней действующей резервной копии, при условии что она была ранее создана.