ВУЗ:
Составители:
11
дескрипторы один указатель позиции в файле, один набор флагов состояния файла,
однако имеют собственные флаги дескриптора.
Основной сферой использования дублирования является перенаправление
ввода/вывода. Прототипы следующих функция находятся в заголовочном файле <
unistd.h>.
int dup (int OLD)
Функция копирует дескриптор OLD в первый доступный номер дескриптора
файла. Функция эквивалентна вызову fcntl (OLD, F_DUPFD, 0).
int dup2 (int OLD, int NEW)
Функция копирует дескриптор OLD в дескриптор NEW. Если OLD является
недопустимым дескриптором, не выполняется никаких действий. В противном случае,
новая копия OLD замещает значение NEW. Если NEW – дескриптор открытого файла,
он закрывается перед дублированием.
Приведем пример использования dup2 для перенаправления ввода/вывода.
pid = fork ();
if (pid == 0)
{
char *filename;
char *program;
int file;
...
file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
dup2 (file, STDIN_FILENO);
TEMP_FAILURE_RETRY (close (file));
execv (program, NULL);
}
Флаги дескрипторов файлов
Флаги дескрипторов представляют собой различные атрибуты дескрипторов.
При дублировании каждый дескриптор имеет собственный набор флагов.
В настоящее время определен лишь один флаг дескриптора FD_CLOEXEC,
означающий, что дескриптор должен быть закрыт в случае использования функции
exec. Следующий макросы определены в файле <fcntl.h>.
int F_GETFD Используется функцией fcntl для получения флага дескриптора. При
задании этой команды функция fcntl возвращает значения флага;
int F_SETFD Используется функцией fcntl для установки значения флага
дескриптора. При вызове требуется третий аргумент и вызов выглядит
таким образом:
fcntl (FILEDES, F_SETFD, NEW-FLAGS)
Аргумент NEW-FLAGS имеет тип int.
Приведем пример изменения флага дескриптора:
int
set_cloexec_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFD, 0);
/* Если произошла ошибка при чтении флага, выходим */
if (oldflags < 0)
return oldflags;
/* Устанавливаем только необходимый флаг */
if (value != 0)
oldflags |= FD_CLOEXEC;
else
oldflags &= ~FD_CLOEXEC;
/* Store modified flag word in the descriptor. */
return fcntl (desc, F_SETFD, oldflags);
}
дескрипторы один указатель позиции в файле, один набор флагов состояния файла,
однако имеют собственные флаги дескриптора.
Основной сферой использования дублирования является перенаправление
ввода/вывода. Прототипы следующих функция находятся в заголовочном файле <
unistd.h>.
int dup (int OLD)
Функция копирует дескриптор OLD в первый доступный номер дескриптора
файла. Функция эквивалентна вызову fcntl (OLD, F_DUPFD, 0).
int dup2 (int OLD, int NEW)
Функция копирует дескриптор OLD в дескриптор NEW. Если OLD является
недопустимым дескриптором, не выполняется никаких действий. В противном случае,
новая копия OLD замещает значение NEW. Если NEW – дескриптор открытого файла,
он закрывается перед дублированием.
Приведем пример использования dup2 для перенаправления ввода/вывода.
pid = fork ();
if (pid == 0)
{
char *filename;
char *program;
int file;
...
file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
dup2 (file, STDIN_FILENO);
TEMP_FAILURE_RETRY (close (file));
execv (program, NULL);
}
Флаги дескрипторов файлов
Флаги дескрипторов представляют собой различные атрибуты дескрипторов.
При дублировании каждый дескриптор имеет собственный набор флагов.
В настоящее время определен лишь один флаг дескриптора FD_CLOEXEC,
означающий, что дескриптор должен быть закрыт в случае использования функции
exec. Следующий макросы определены в файле .
int F_GETFD Используется функцией fcntl для получения флага дескриптора. При
задании этой команды функция fcntl возвращает значения флага;
int F_SETFD Используется функцией fcntl для установки значения флага
дескриптора. При вызове требуется третий аргумент и вызов выглядит
таким образом:
fcntl (FILEDES, F_SETFD, NEW-FLAGS)
Аргумент NEW-FLAGS имеет тип int.
Приведем пример изменения флага дескриптора:
int
set_cloexec_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFD, 0);
/* Если произошла ошибка при чтении флага, выходим */
if (oldflags < 0)
return oldflags;
/* Устанавливаем только необходимый флаг */
if (value != 0)
oldflags |= FD_CLOEXEC;
else
oldflags &= ~FD_CLOEXEC;
/* Store modified flag word in the descriptor. */
return fcntl (desc, F_SETFD, oldflags);
}
11
Страницы
- « первая
- ‹ предыдущая
- …
- 9
- 10
- 11
- 12
- 13
- …
- следующая ›
- последняя »
