fnmatch

title: fnmatch(3)

summary: сравнивает имя файла или путь

text:
# fnmatch(3)

## ИМЯ
fnmatch - сравнивает имя файла или путь

## ОБЗОР

```
#include <fnmatch.h>
```

```
int fnmatch(const char *pattern, const char *string, int flags);
```

## ОПИСАНИЕ
Функция fnmatch() проверяет, совпадает ли параметр string с параметром pattern, который является подстановочным шаблоном оболочки (смотрите glob(7)).

Аргумент flags изменяет поведение; он является битовой маской и может содержать следующие флаги:

FNM_NOESCAPE

Если этот флаг установлен, то обратная косая черта воспринимается как простой символ, а не специальный.

FNM_PATHNAME

Если этот флаг установлен, то косая черта в строке string будет совпадать только с косой чертой в шаблоне pattern, но не с метасимволом звёздочка (*) или вопросительным знаком (?) и не последовательностью в квадратных скобках ([]), содержащую косую черту.

FNM_PERIOD

Если этот флаг установлен, то начальная точка в строке string должна сравниваться именно с точкой в шаблоне pattern. Точка считается начальной, если она является первым символом в строке string, или если установлен флаг FNM_PATHNAME и точка следует сразу за косой чертой.

FNM_FILE_NAME

Синоним FNM_PATHNAME в GNU.

FNM_LEADING_DIR

Если этот флаг (расширение GNU) установлен, то строка считается совпавшей с шаблоном, если совпадает начальный сегмент строки string, который следует сразу за косой чертой. Этот флаг для внутреннего использования glibc и не всегда реализуется.

FNM_CASEFOLD

Если этот флаг (расширение GNU) установлен, то выражения сравниваются без учёта регистра символов.

FNM_EXTMATCH

Если этот флаг (расширение GNU) установлен, то поддерживаются расширенные шаблоны из 'ksh' и теперь поддерживаемые другими оболочками. В расширенном формате pattern-list предоставляет собой список шаблонов, разделённых '|', входит следующее:

'?(pattern-list)'

Шаблон совпадает, если ноль или одно вхождение любого шаблона в pattern-list совпадает с входной строкой string.

'*(pattern-list)'

Шаблон совпадает, если ноль или более вхождений любых шаблонов в pattern-list совпадает с входной строкой string.

'+(pattern-list)'

Шаблон совпадает, если одно или более вхождений любых шаблонов в pattern-list совпадает с входной строкой string.

'@(pattern-list)'

Шаблон совпадает, если только одно вхождение любого шаблона в pattern-list совпадает с входной строкой string.

'!(pattern-list)'

Шаблон совпадает, если входная строка string не совпадает с каким-либо шаблоном в pattern-list.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращает ноль, если строка string совпадает с шаблоном pattern, возвращает FNM_NOMATCH, если строка и шаблон не совпадают, или другое ненулевое значение, если произошла ошибка.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fnmatch()

Безвредность в нитях

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, POSIX.2. Флаги FNM_FILE_NAME, FNM_LEADING_DIR и FNM_CASEFOLD являются расширениями GNU.

## СМОТРИТЕ ТАКЖЕ
sh(1), glob(3), scandir(3), wordexp(3), glob(7)


fopen

package: man-pages-ru

title: fopen(3)

summary: функции для открытия потоков

text:
# fopen(3)

## ИМЯ
fopen, fdopen, freopen - функции для открытия потоков

## ОБЗОР

```
#include <stdio.h>
```

```
FILE *fopen(const char *pathname, const char *mode);
```

```
FILE *fdopen(int fd, const char *mode);
```

```
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

fdopen(): _POSIX_C_SOURCE

## ОПИСАНИЕ
Функция fopen() открывает файл с именем, которое задано в виде строки в pathname, и связывает его с потоком.

Параметр mode указывает на строку, начинающуюся с одной из следующих последовательностей (за ними могут следовать дополнительные символы, описанные далее):

r

Открыть текстовый файл для чтения. Поток совмещается с началом файла.

r+

Открыть для чтения и записи. Поток совмещается с началом файла.

w

Обрезать файл до нулевой длины или создать текстовый файл для записи. Поток совмещается с началом файла.

w+

Открыть для чтения и записи. Файл создаётся, если его не существует, в противном случае он обрезается. Поток совмещается с началом файла.

a

Открыть для добавления (записи в конец файла). Файл создаётся, если его не существует. Поток совмещается с концом файла.

a+

Открыть для чтения и добавления (записи в конец файла). Файл создаётся, если не существует. Вывод всегда добавляется в конец файла. В POSIX ничего не упоминается о начальном положении при чтении, когда используется данный режим. В glibc начальное положение в файле для чтения устанавливается в начало файла, но в Android/BSD/MacOS начальное положение в файле для чтения устанавливается в конец файла.

Строка mode может также содержать символ «b» в качестве последнего символа или символа между двумя символами в любых описанных выше двухсимвольных комбинациях. Это требуется только для совместимости с C89 и не оказывает никакого влияния; символ «b» игнорируется во всех POSIX-совместимых системах, включая Linux. Другие системы могут по-разному обращаться с текстовыми и двоичными файлами, и добавление «b» может оказаться полезным, если вы осуществляете ввод-вывод в двоичный файл и ожидаете, что ваша программа может быть перенесена в не UNIX окружение.

О имеющихся расширениях mode в glibc смотрите ЗАМЕЧАНИЯ далее.

Любой созданный файл будет иметь атрибуты S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666), как изменённые в соответствии со значением umask процесса (смотрите umask(2)).

Чтение и запись могут перемешиваться друг с другом в потоке, открытом для чтения/записи, в любом порядке). Заметим, что в ANSI C требуется, чтобы между выводом и вводом использовались функции позиционирования в файле, если операция ввода не встретила конец файла. Если это условие не выполняется, то при чтении разрешается возвращать результат, не совпадающий с данными самой последней записи. Поэтому рекомендуется (а иногда и действительно необходимо в Linux) использовать функции fseek(3) или fgetpos(3) между операциями чтения и записи в одном потоке. Эти операции могут фактически быть пустыми (например, fseek(..., 0L, SEEK_CUR), вызванная для того, чтобы возник её побочный эффект синхронизации).

Открытие файла в режиме дописывания (a в качестве первого символа mode) приводит к тому, что все последующие операции записи в этот поток производятся в конец файла, как если бы перед ними была вызвана:

```
fseek(stream, 0, SEEK_END);
```

Файловый дескриптор, связанный с потоком, открывается как при вызове open(2) со следующими флагами:

режим fopen()

флаги open()

r

O_RDONLY

w

O_WRONLY | O_CREAT | O_TRUNC

a

O_WRONLY | O_CREAT | O_APPEND

r+

O_RDWR

w+

O_RDWR | O_CREAT | O_TRUNC

a+

O_RDWR | O_CREAT | O_APPEND

### fdopen()
Функция fdopen() связывает поток с существующим дескриптором файла fd. Режим mode потока (одно из следующих значений: «r», «r+», «w», ,w+», «a», «a+») должен быть совместим с режимом дескриптора файла. Указатель положения в файле в новом потоке принимает значение, равное значению у fd, а указатели ошибок и конца файла очищаются. Режимы «w» или «w+» не обрезают файл. При этом не делается копия дескриптора файла и он будет закрыт одновременно с закрытием потока, созданного fdopen(). Результат применения fdopen() к общему объекту памяти не определён.

### freopen()
Функция freopen() открывает файл с именем pathname и связывает его с потоком, указанным в stream. Исходный поток (если такой существовал) закрывается. Значение параметра mode такое же как для функции fopen().

Если значение pathname равно указателю null, то freopen() изменяет режим потока на указанный в mode; то есть, freopen() переоткрывает pathname, связанный с потоком. Описание этого поведения было добавлено в стандарт C99, где сказано:

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

Основной задачей функции freopen() является смена файла, связанного со стандартным текстовым потоком (stderr, stdin или stdout).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении fopen(), fdopen() и freopen() возвращается указатель FILE. В противном случае возвращается NULL и errno присваивается код ошибки.

## ОШИБКИ
EINVAL

Передано неверное значение mode в fopen(), fdopen() или freopen().

Функции fopen(), fdopen() и freopen() могут также завершаться с ошибками и устанавливают значение errno равным какому-либо значению из определённых в malloc(3).

Функция fopen() при ошибках устанавливает значение errno равным какому-либо значению из определённых в open(2).

Функция fdopen() при ошибках устанавливает значение errno равным какому-либо значению из определённых в fcntl(2).

Функция freopen() при ошибках устанавливает errno равным какому-либо значению из определённых в open(2), fclose(3) и fflush(3).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fopen(), fdopen(), freopen()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C89, C99.

fdopen(): POSIX.1-2001, POSIX.1-2008.

## ЗАМЕЧАНИЯ

### Замечания по glibc
Библиотека GNU C предоставляет следующие расширения строки в mode:

c (начиная с glibc 2.3.3)

Не выполнять операцию открытия, последующие чтение и запись, точки отмены нити (thread cancellation points). Этот флаг игнорируется для fdopen().

e (начиная с glibc 2.7)

Открыть файл с флагом O_CLOEXEC. Подробности смотрите в open(2). Этот флаг игнорируется для fdopen().

m (начиная с glibc 2.3)

Пытаться получить доступ к файлу с помощью mmap(2), а не с помощью системных операций ввода-вывода (read(2), write(2)). В настоящее время mmap(2) используется только для файла, открытого на чтение.

x

Открыть файл в монопольном режиме (как с флагом O_EXCL у open(2)). Если файл уже существует, то fopen() завершается с ошибкой и устанавливает значение errno равное EEXIST. Этот флаг игнорируется для fdopen().

В дополнении к этим символам, для fopen() и freopen() поддерживается следующий синтаксис в mode:

,ccs=строка

Передаваемая строка используется как имя набора символов и поток помечается как широкосимвольный. С того момента внутренние функции преобразования перекодируют данные ввода-вывода в соответствии с набором символов с именем строка. Если синтаксис ,ccs=строка не указан, то широкосимвольность потока определяется по первой файловой операции. Если это операция является широкосимвольной, то поток помечается как широкосимвольный и загружаются функции для перекодировки.

## ДЕФЕКТЫ
При анализе отдельных флагов в mode (т. е., символов перед «ccs») реализация glibc для fopen() и freopen() ограничивает количество обрабатываемых в mode символов 7-ю (или, в glibc до версии 2.14, 6-ю, что было недостаточно для включения всех возможных флагов, например «rb+cmxe»). Текущая реализация fdopen() анализирует в mode не более 5 символов.

## СМОТРИТЕ ТАКЖЕ
open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3)

branch: sisyphus


fopencookie

title: fopencookie(3)

summary: открывает нестандартный поток

text:
# fopencookie(3)

## ИМЯ
fopencookie - открывает нестандартный поток

## ОБЗОР

```
#define _GNU_SOURCE         /* см. feature_test_macros(7) */
#include <stdio.h>
```

```
FILE *fopencookie(void *cookie, const char *mode,
                  cookie_io_functions_t io_funcs);
```

## ОПИСАНИЕ
Функция fopencookie() позволяет программисту создать нестандартную реализацию стандартного потока ввода-вывода. Эта реализация может хранить данные потока в расположении по своему выбору; например, fopencookie() используется для реализации функции fmemopen(3), которая предоставляет потоковый интерфейс для данных, хранящихся в буфере в памяти.

Для создания нестандартного потока программист должен:

- Реализовать четыре «обрабатывающих» (hook) функции, которые используются внутри стандартной библиотеки ввода-вывода при операциях ввода-вывода над потоком.

- Определить тип данных «cookie» — структуру для учёта информации (например, где хранятся данные), используемую вышеупомянутыми обрабатывающими функциями. Стандартный пакет ввода-вывода ничего не знает о содержимом этого cookie (к нему обращаются как к void * при передаче в fopencookie()), но автоматически передаёт cookie в первом аргументе при вызове обрабатывающих функций.

- Вызвать fopencookie() для открытия нового потока и связывания cookie и обрабатывающими функциями с этим потоком.

Функция fopencookie() подобна fopen(3): она открывает новый поток и возвращает указатель на объект FILE, который используется для работы с потоком.

Аргумент cookie — это указатель на структуру cookie вызывающего, которая связывается с новым потоком. Данный указатель передаётся в первом аргументе в моменты, когда стандартная библиотека ввода-вывода вызывает одну из обрабатывающих функций, описанных ниже.

Аргумент mode служит той же цели что и для fopen(3). Поддерживаются следующие режимы: r, w, a, r+, w+ и a+. Подробности смотрите в fopen(3).

Аргумент io_funcs — это структура, которая содержит четыре поля с задаваемыми программистом обрабатывающими функциями, которые используются для реализации этого потока. Структура определена как

```
typedef struct {

    cookie_read_function_t  *read;

    cookie_write_function_t *write;

    cookie_seek_function_t  *seek;

    cookie_close_function_t *close;
} cookie_io_functions_t;
```

Поля:

cookie_read_function_t *read

Эта функция реализует операции чтения из потока. Она вызывается с тремя аргументами:

ssize_t read(void *cookie, char *buf, size_t size);

Аргументы buf и size — буфер для получаемых данных и его размер. В качестве результата функция read возвращает количество байт, скопированных в buf, 0 — при окончании файла и -1 при ошибке. Функция read обновляет смещение в потоке соответствующим образом.

Если значение *read равно null, то при чтении из нестандартного потока всегда возвращается конец файла.

cookie_write_function_t *write

Эта функция реализует операции записи в поток. Она вызывается с тремя аргументами:

ssize_t write(void *cookie, const char *buf, size_t size);

Аргументы buf и size — буфер для выходных данных и его размер (данные, записываемые в поток). В качестве результата функция write возвращает количество байт, скопированных из buf, и 0 при ошибке (функция не должна возвращать отрицательное значение). Функция write обновляет смещение в потоке соответствующим образом.

Если значение *write равно null, то вывод в поток отбрасывается.

cookie_seek_function_t *seek

Эта функция реализует операции смещения в потоке. Она вызывается с тремя аргументами:

int seek(void *cookie, off64_t *offset, int whence);

В аргументе *offset указывается новое файловое смещение, зависящее от значения whence:

SEEK_SET

Значение смещения приравнивается *offset байт от начала потока.

SEEK_CUR

Значение *offset должно быть добавлено к текущему смещению в потоке.

SEEK_END

Значение смещения приравнивается к размеру потока плюс *offset.

Перед возвратом функция seek должна обновить *offset, чтобы показать новое смещение в потоке.

В качестве результата функция seek должна возвращать 0 при успешном выполнении и -1 при ошибке.

Если значение *seek равно null, то операции смещения в потоке выполнить невозможно.

cookie_close_function_t *close

Эта функция закрывает поток. Обрабатывающая функция может выполнить такие операции как освобождение буферов, выделенных для потока. При вызове она принимает один аргумент:

int close(void *cookie);

Аргумент cookie — это cookie, которую программист передал при вызове fopencookie().

В качестве результата функция close должна возвращать 0 при успешном выполнении и EOF при ошибке.

Если значение *close равно NULL, то при закрытии потока не выполняется никаких действий.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении fopencookie() возвращает указатель на новый поток. При ошибке возвращается NULL.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fopencookie()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция является нестандартным расширением GNU.

## ПРИМЕР
Программа, представленная ниже, реализует нестандартный поток, свойства которого похожи (но не одинаковы) на свойство потока, получаемого от fmemopen(3). Она реализует поток, данные которого хранятся в буфере памяти. Программа записывает свои аргументы командной строки в поток, а затем перемещается по потоку, читая два из каждых пяти символов и записывая их в стандартный вывод. Сеанс оболочки, демонстрирующий использование программы:

```
$ ./a.out 'hello world'
/he/
/ w/
/d/
Достигнут конец файла
```

Заметим, что представленную версию можно сильно улучшить, добавив обработку ошибок (например, открытие потока с cookie, которая уже имеет открытый поток; закрытие потока, который уже был закрыт).

### Исходный код программы

```
#define _GNU_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define INIT_BUF_SIZE 4
struct memfile_cookie {

    char   *buf;        /* динамически изменяемый буфер для данных */

    size_t  allocated;  /* размер буфера */

    size_t  endpos;     /* количество символов в буфере */

    off_t   offset;     /* текущее файловое смещение в буфере */
};
ssize_t
memfile_write(void *c, const char *buf, size_t size)
{

    char *new_buff;

    struct memfile_cookie *cookie = c;

    /* Буфер мал? Удваиваем размер, пока не станет достаточным */

    while (size + cookie->offset > cookie->allocated) {

        new_buff = realloc(cookie->buf, cookie->allocated * 2);

        if (new_buff == NULL) {

            return -1;

        } else {

            cookie->allocated *= 2;

            cookie->buf = new_buff;

        }

    }

    memcpy(cookie->buf + cookie->offset, buf, size);

    cookie->offset += size;

    if (cookie->offset > cookie->endpos)

        cookie->endpos = cookie->offset;

    return size;
}
ssize_t
memfile_read(void *c, char *buf, size_t size)
{

    ssize_t xbytes;

    struct memfile_cookie *cookie = c;

    /* Выбираем минимум запрашиваемых и доступных байт */

    xbytes = size;

    if (cookie->offset + size > cookie->endpos)

        xbytes = cookie->endpos - cookie->offset;

    if (xbytes < 0)     /* смещение может быть за endpos */

       xbytes = 0;

    memcpy(buf, cookie->buf + cookie->offset, xbytes);

    cookie->offset += xbytes;

    return xbytes;
}
int
memfile_seek(void *c, off64_t *offset, int whence)
{

    off64_t new_offset;

    struct memfile_cookie *cookie = c;

    if (whence == SEEK_SET)

        new_offset = *offset;

    else if (whence == SEEK_END)

        new_offset = cookie->endpos + *offset;

    else if (whence == SEEK_CUR)

        new_offset = cookie->offset + *offset;

    else

        return -1;

    if (new_offset < 0)

        return -1;

    cookie->offset = new_offset;

    *offset = new_offset;

    return 0;
}
int
memfile_close(void *c)
{

    struct memfile_cookie *cookie = c;

    free(cookie->buf);

    cookie->allocated = 0;

    cookie->buf = NULL;

    return 0;
}
int
main(int argc, char *argv[])
{

    cookie_io_functions_t  memfile_func = {

        .read  = memfile_read,

        .write = memfile_write,

        .seek  = memfile_seek,

        .close = memfile_close

    };

    FILE *stream;

    struct memfile_cookie mycookie;

    ssize_t nread;

    long p;

    int j;

    char buf[1000];

    /* Устанавливаем cookie перед вызовом fopencookie() */

    mycookie.buf = malloc(INIT_BUF_SIZE);

    if (mycookie.buf == NULL) {

        perror("malloc");

        exit(EXIT_FAILURE);

    }

    mycookie.allocated = INIT_BUF_SIZE;

    mycookie.offset = 0;

    mycookie.endpos = 0;

    stream = fopencookie(&mycookie,"w+", memfile_func);

    if (stream == NULL) {

        perror("fopencookie");

        exit(EXIT_FAILURE);

    }

    /* Записываем аргументы командной строки в файл */

    for (j = 1; j < argc; j++)

        if (fputs(argv[j], stream) == EOF) {

            perror("fputs");

            exit(EXIT_FAILURE);

        }

    /* Читаем два байта из пяти пока не получим EOF */

    for (p = 0; ; p += 5) {

        if (fseek(stream, p, SEEK_SET) == -1) {

            perror("fseek");

            exit(EXIT_FAILURE);

        }

        nread = fread(buf, 1, 2, stream);

        if (nread == -1) {

            perror("fread");

            exit(EXIT_FAILURE);

        }

        if (nread == 0) {

            printf("Достигнут конец файла\n");

            break;

        }

        printf("/%.*s/\n", nread, buf);

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
fclose(3), fmemopen(3), fopen(3), fseek(3)


fpathconf

title: fpathconf(3)

summary: получают параметры настроек для файлов

text:
# fpathconf(3)

## ИМЯ
fpathconf, pathconf - получают параметры настроек для файлов

## ОБЗОР

```
#include <unistd.h>
```

```
long fpathconf(int fd, int name);
long pathconf(const char *path, int name);
```

## ОПИСАНИЕ
fpathconf() получает значение параметра настроек name для открытого дескриптора файла fd.

pathconf() получает значение параметра настроек name для файла с именем path.

Соответствующие макросы, определённые в <unistd.h>, выдают минимальные значения; если приложение собирается использовать изменяющиеся значения, то необходимо вызывать функции fpathconf() или pathconf(), которые выдают более гибкий результат.

При установке значения name в следующие константы возвращаются соответствующие им параметры настройки:

_PC_LINK_MAX

Максимальное количество ссылок на файл. Если fd или path указывают на каталог, то значение применяется ко всему каталогу. Соответствует макросу _POSIX_LINK_MAX.

_PC_MAX_CANON

Максимальная длина отформатированной строки ввода, причём, fd или path должны указывать на терминал. Соответствует макросу _POSIX_MAX_CANON.

_PC_MAX_INPUT

Максимальная длина строки ввода, причём, fd или path должны указывать на терминал. Соответствует макросу _POSIX_MAX_INPUT.

_PC_NAME_MAX

Максимальная длина имени файла в каталоге path или fd, которую разрешено использовать процессу при создании файла. Соответствует макросу _POSIX_NAME_MAX.

_PC_PATH_MAX

Максимальная длина относительного имени файла, где path или fd являются текущим рабочим каталогом. Соответствует макросу _POSIX_PATH_MAX.

_PC_PIPE_BUF

Максимальное количество байт, которое может быть атомарно записано в канал FIFO. Для fpathconf() значение fd должно указывать на канал или FIFO. Для fpathconf() значение path должно указывать на FIFO или каталог; в последнем случае возвращаемое значение соответствует FIFO, созданному в этом каталоге. Соответствует макросу _POSIX_PIPE_BUF.

_PC_CHOWN_RESTRICTED

Возвращает положительное значение, если использование chown(2) и fchown(2) для изменения идентификатора пользователя файла ограничено для процесса с соответствующими правами и изменение идентификатора группы файла на значение, отличающееся от идентификатора эффективной группы процесса или его вспомогательных идентификаторов групп, ограничено для процесса с соответствующими правами. Согласно POSIX.1, эта переменная всегда должна быть определена со значением не равным -1. Соответствует макросу _POSIX_CHOWN_RESTRICTED.

Если fd или path указывают на каталог, то возвращаемое значение относится ко всем файлам в этом каталоге.

_PC_NO_TRUNC

Возвращает ненулевое значение, если при доступе к файловым именам длиннее, чем _POSIX_NAME_MAX, возникает ошибка. Соответствует макросу _POSIX_NO_TRUNC.

_PC_VDISABLE

Возвращает ненулевое значение, если обработка спецсимволов может быть отключена, при этом fd или path должны указывать на терминал.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращаемым значением этих функций может быть одно из:

- При ошибке возвращается -1, а в errno содержится код ошибки (например, EINVAL означает, что некорректно name).

- Если name соответствует максимальному или минимальному ограничителю и этот ограничитель не определён, то возвращается -1 и errno не изменяется (чтобы отличать неопределённый ограничитель от ошибки, сбросьте errno в ноль пере вызовом, а затем проверьте, что errno не равно нулю, если возвращается -1).

- Если name соответствует параметру, то возвращается положительное значение, если параметр поддерживается и -1, если параметр не поддерживается.

- В противном случае возвращается текущее значение параметра или ограничителя. Это значение будет не более ограничивающем чем соответствующее значение, которое было показано приложению в <unistd.h> или <limits.h> при компиляции.

## ОШИБКИ
EACCES

(pathconf()) Запрещён поиск в одном из каталогов пути path.

EBADF

(fpathconf()) Значение fd не является правильным файловым дескриптором.

EINVAL

Неверное значение name.

EINVAL

Реализация не поддерживает связь name с указанным файлом.

ELOOP

(pathconf()) Во время определения path встретилось слишком много символьных ссылок.

ENAMETOOLONG

(pathconf()) Слишком длинное значение аргумента path.

ENOENT

(pathconf()) Компонент пути path не существует или в path указана пустая строка.

ENOTDIR

(pathconf()) Компонент пути, использованный как каталог в path, в действительности таковым не является.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fpathconf(), pathconf()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

## ЗАМЕЧАНИЯ
Файлы, имена которых длиннее, чем значение, возвращаемое для name и равны _PC_NAME_MAX, могут существовать в заданном каталоге.

Некоторые возвращаемые значения могут быть огромны; соответствующие им объекты невозможно разместить в памяти.

## СМОТРИТЕ ТАКЖЕ
getconf(1), open(2), statfs(2), confstr(3), sysconf(3)


fpclassify

title: fpclassify(3)

summary: макросы классификации чисел с

text:
# fpclassify(3)

## ИМЯ
fpclassify, isfinite, isnormal, isnan, isinf - макросы классификации чисел с плавающей запятой

## ОБЗОР

```
#include <math.h>
```

```
int fpclassify(x);
```

```
int isfinite(x);
```

```
int isnormal(x);
```

```
int isnan(x);
```

```
int isinf(x);
```

Компонуется при указании параметра -lm.

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

fpclassify(), isfinite(), isnormal():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

isnan(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

isinf(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
У чисел с плавающей запятой есть специальные значения, например для бесконечности или NaN. С помощью макроса fpclassify(x) вы можете выяснить тип x. В качестве аргумента макрос принимает любое выражение с плавающей запятой. Результатом будет одно из следующих значений:

FP_NAN

Значение x не является числом («Not a Number»).

FP_INFINITE

Значение x стремится к плюс или минус бесконечности.

FP_ZERO

Значение x равно нулю.

FP_SUBNORMAL

Значение x слишком мало для представления в нормализованном формате.

FP_NORMAL

Если значение не равно ни одному из вышеперечисленных, то это обычное число с плавающей запятой.

Остальные макросы предоставляют короткие ответы на некоторые стандартные вопросы.

isfinite(x)

возвращает ненулевое значение, если

(fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)

isnormal(x)

возвращает ненулевое значение, если (fpclassify(x) == FP_NORMAL)

isnan(x)

возвращает ненулевое значение, если (fpclassify(x) == FP_NAN)

isinf(x)

возвращает 1, если x равно положительной бесконечности и -1, если x равно отрицательной бесконечности.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fpclassify(), isfinite(), isnormal(), isnan(), isinf()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

Про isinf() в стандартах лишь сказано, что этот макрос возвращает ненулевое значение, если только аргумент равен бесконечности.

## ЗАМЕЧАНИЯ
В glibc 2.01 и более ранних isinf() возвращает ненулевое значение (а именно 1), если x равно положительной или отрицательной бесконечности (это всё, что требует C99).

## СМОТРИТЕ ТАКЖЕ
finite(3), INFINITY(3), isgreater(3), signbit(3)


fpurge

title: fpurge(3)

summary: вычищает поток

text:
# fpurge(3)

## ИМЯ
fpurge, __fpurge - вычищает поток

## ОБЗОР

```
/* не поддерживается */
#include <stdio.h>
```

```
int fpurge(FILE *stream);
/* поддерживается */
#include <stdio.h>
#include <stdio_ext.h>
```

```
void  __fpurge(FILE *stream);
```

## ОПИСАНИЕ
Функция fpurge() очищает буферы указанного потока. При этом для потоков вывода отбрасываются все незаписанные данные. Для потоков ввода отбрасывается все данные, полученные от объекта, но ещё не выбранные getc(3), в том числе, любой текст, занесённый с помощью ungetc(3). Смотрите также fflush(3).

Функция __fpurge() делает то же самое, но не возвращает никакого значения.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении fpurge() возвращает 0. При ошибке возвращается -1 и переменная errno устанавливается соответствующим образом.

## ОШИБКИ
EBADF

Значение stream не является открытым потоком.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

__fpurge()

Безвредность в нитях

MT-Safe race:stream

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции нестандартны и не являются переносимыми. Функция fpurge() появилась из BSD 4.4 и отсутствует в Linux. Функция __fpurge() появилась из Solaris и включена в glibc начиная с версии 2.1.95.

## ЗАМЕЧАНИЯ
Как правило, отбрасывать содержимое буферов ввода является ошибкой.

## СМОТРИТЕ ТАКЖЕ
fflush(3), setbuf(3), stdio_ext(3)


fputwc

title: fputwc(3)

summary: записывает широкий символ в поток FILE

text:
# fputwc(3)

## ИМЯ
fputwc, putwc - записывает широкий символ в поток FILE

## ОБЗОР

```
#include <stdio.h>
#include <wchar.h>
```

```
wint_t fputwc(wchar_t wc, FILE *stream);
wint_t putwc(wchar_t wc, FILE *stream);
```

## ОПИСАНИЕ
Функция fputwc — это эквивалент функции fputc(3), но для широких символов. Она записывает широкий символ wc в поток stream. Если значение ferror(stream) истинно, то возвращается WEOF. Если при преобразовании в широкий символ возникает ошибка, то значение переменной errno устанавливается равным EILSEQ и возвращается WEOF. В любом другом случае возвращается wc.

Функция putwc() — это функция, или макрос, идентичный fputwc(). Она может быть реализована в виде макроса, и может вычислять свой аргумент более одного раза. Вообще нет смысла использовать эту функцию.

Неблокирующие аналоги смотрите в unlocked_stdio(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция fputwc() возвращает wc, если не было ошибок, или WEOF в противном случае. При ошибке в errno записывается соответствующее значение.

## ОШИБКИ
Кроме обычных могут возникать:

EILSEQ

Не удалось преобразовать wc в кодировку потока.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fputwc(), putwc()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

## ЗАМЕЧАНИЯ
Поведение fputwc() зависит от категории LC_CTYPE текущей локали.

Из-за отсутствия дополнительной информации, передаваемой в fopen(3), закономерно ожидать, что fputwc() на самом деле пишет многобайтовую последовательность, соответствующую широкому символу wc.

## СМОТРИТЕ ТАКЖЕ
fgetwc(3), fputws(3), unlocked_stdio(3)


fputws

title: fputws(3)

text:
# fputws(3)

## ИМЯ
fputws - записывает строку широких символов в поток FILE

## ОБЗОР

```
#include <wchar.h>
```

```
int fputws(const wchar_t *ws, FILE *stream);
```

## ОПИСАНИЕ
Функция fputws() — эквивалент fputs(3) для строк широких символов. Она записывает строку широких символов, начинающуюся с ws до, но не включая, завершающего широкого символа null (L'\0'), в stream.

Неблокирующий аналог смотрите в unlocked_stdio(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция fputws() возвращает неотрицательное целое число, если операция завершилась успешно, или -1 для обозначения ошибки.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fputws()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

## ЗАМЕЧАНИЯ
Поведение fputws() зависит от категории LC_CTYPE текущей локали.

Из-за отсутствия дополнительной информации, передаваемой в fopen(3), закономерно ожидать, что fputws() на самом деле пишет многобайтовую строку, соответствующую строке широких символов ws.

## СМОТРИТЕ ТАКЖЕ
fputwc(3), unlocked_stdio(3)


fread

title: fread(3)

summary: ввод/вывод из двоичного потока

text:
# fread(3)

## ИМЯ
fread, fwrite - ввод/вывод из двоичного потока

## ОБЗОР

```
#include <stdio.h>
```

```
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
```

```
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
              FILE *stream);
```

## ОПИСАНИЕ
Функция fread() считывает nmemb единиц данных (размер каждого size байт) из потока, на который указывает stream, и сохраняет их в расположение, на которое указывает ptr.

Функция fwrite() записывает nmemb единиц данных (размер каждого size байт) в поток, на который указывает stream, получая их из расположения, на которое указывает ptr.

Неблокирующие аналоги смотрите в unlocked_stdio(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функции fread() и fwrite() возвращают количество считанных или записанных единиц. Это количество равно количеству переданных байт только, если значение size равно 1. В случае ошибки или по достижении конца файла возвращается меньшее количество единиц (или ноль).

Функция fread() не отличает возникновение ошибки и достижения конца файла; для точного определения необходимо вызывать функции feof(3) и ferror(3).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fread(), fwrite()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89.

## СМОТРИТЕ ТАКЖЕ
read(2), write(2), feof(3), ferror(3), unlocked_stdio(3)


frexp

title: frexp(3)

text:
# frexp(3)

## ИМЯ
frexp, frexpf, frexpl - приводит число с плавающей точкой к виду мантисса/степень

## ОБЗОР

```
#include <math.h>
```

```
double frexp(double x, int *exp);
float frexpf(float x, int *exp);
long double frexpl(long double x, int *exp);
```

Компонуется при указании параметра -lm.

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

frexpf(), frexpl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Эти функции используются для разделения числа x на нормализованную мантиссу и степень, которая сохраняется в exp.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Эти функции возвращают нормализованную мантиссу. Если аргумент x не равен нулю, то нормализованная мантисса равна x степеням двойки, а её абсолютное значение всегда находится в диапазоне от 1/2 (включительно) до 1 (не включая), то есть [0.5,1).

Если значение x равно нулю, то нормализованная мантисса равна нулю, и ноль сохраняется в exp.

Если значение x равно NaN, то возвращается NaN, а значение *exp не определено.

Если x равно плюс или минус бесконечность, то будет возвращена плюс или минус бесконечность, а значение *exp не определено.

## ОШИБКИ
Ошибки не возникают.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

frexp(), frexpf(), frexpl()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
C99, POSIX.1-2001, POSIX.1-2008.

Вариант, возвращающий значение типа double, также соответствует SVr4, 4.3BSD, C89.

## ПРИМЕР
Нижеследующая программа выдает такие результаты:

```
$ ./a.out 2560
frexp(2560, &e) = 0.625: 0.625 * 2^12 = 2560
$ ./a.out -4
frexp(-4, &e) = -0.5: -0.5 * 2^3 = -4
```

### Исходный код программы

```
#include <math.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

    double x, r;

    int exp;

    x = strtod(argv[1], NULL);

    r = frexp(x, &exp);

    printf("frexp(%g, &e) = %g: %g * %d^%d = %g\n",

           x, r, r, FLT_RADIX, exp, x);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
ldexp(3), modf(3)


fseek

title: fseek(3)

summary: меняют положение в потоке

text:
# fseek(3)

## ИМЯ
fgetpos, fseek, fsetpos, ftell, rewind - меняют положение в потоке

## ОБЗОР
\#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);

long ftell(FILE *stream);

void rewind(FILE *stream);

int fgetpos(FILE *stream, fpos_t *pos);

int fsetpos(FILE *stream, const fpos_t *pos);

## ОПИСАНИЕ
Функция fseek() устанавливает положение файлового индикатора в потоке, на который указывает аргумент stream. Новое положение (в байтах) получается прибавлением offset байтов к положению, которое задаётся параметром whence. Если значение whence равно SEEK_SET, SEEK_CUR или SEEK_END, то смещение указывается относительно начала файла, текущего положения указателя или конца файла, соответственно. Успешный вызов функции fseek() очищает (clear) индикатор конца файла потока и отменяет влияние функции ungetc(3) на этот же поток.

Функция ftell() возвращает текущее значение файлового индикатора положения для потока, на который указывает stream.

Функция rewind() устанавливает файловый индикатор положения для потока, на который указывает stream, равным началу файла. Эта функция эквивалентна вызову:

(void) fseek(stream, 0L, SEEK_SET)

хотя в этом случае также сбрасывается индикатор ошибок потока (смотрите clearerr(3)).

Функции fgetpos() и fsetpos() эквивалентны ftell() и fseek() (где значение whence равно SEEK_SET); они сохраняют или устанавливают текущее значение файлового смещения в объектах, определяемых pos. В некоторых не-UNIX системах объект fpos_t может быть сложным объектом, а данные функции могут быть единственным переносимым способом изменения положения в текстовом потоке.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция rewind() не возвращает значений. При успешном выполнении функции fgetpos(), fseek(), fsetpos() возвращают 0, а ftell() возвращает значение текущего смещения. В противном случае возвращается -1, а в errno записывается соответствующий код ошибки.

## ОШИБКИ
EINVAL

Значение whence в fseek() не равно SEEK_SET, SEEK_ или SEEK_CUR. Или результирующее смещение файла получается отрицательным.

ESPIPE

Связанный со stream файловый дескриптор не допускает перемоток (верно для каналов, FIFO или сокетов).

При ошибках функции fgetpos(), fseek(), fsetpos() и ftell() устанавливают значение errno равным значению, определённому в функциях fflush(3), fstat(2), lseek(2) и malloc(3).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fseek(), ftell(), rewind(), fgetpos(), fsetpos()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99.

## СМОТРИТЕ ТАКЖЕ
lseek(2), fseeko(3)


fseeko

title: fseeko(3)

summary: изменить или сообщить положение в файле

text:
# fseeko(3)

## ИМЯ
fseeko, ftello - изменить или сообщить положение в файле

## ОБЗОР

```
#include <stdio.h>
```

```
int fseeko(FILE *stream, off_t offset, int whence);
```

```
off_t ftello(FILE *stream);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

fseeko(), ftello():

_FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L

(с определением устаревшего макроса _LARGEFILE_SOURCE также сработает)

## ОПИСАНИЕ
Функции fseeko() и ftello() идентичны функциям fseek(3) и ftell(3) (смотрите fseek(3)), соответственно, за исключением того, что аргумент offset функции fseeko() и возвращаемое значение функции ftello() вместо типа long имеют тип off_t.

На некоторых архитектурах аргументы off_t и long являются 32-битными типами, но если определить _FILE_OFFSET_BITS со значением 64 (до включения каких-либо заголовочных файлов), то off_t станет 64-битным типом.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении fseeko() возвращает 0, ftello() возвращает текущее смещение. При ошибке возвращается -1, а в errno содержится код ошибки.

## ОШИБКИ
Смотрите ОШИБКИ в fseek(3).

## ВЕРСИИ
Эти функции доступны в glibc начиная с версии 2.1.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fseeko(), ftello()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SUSv2.

## СМОТРИТЕ ТАКЖЕ
fseek(3)


ftime

title: ftime(3)

summary: возвращает дату и время

text:
# ftime(3)

## ИМЯ
ftime - возвращает дату и время

## ОБЗОР
\#include <sys/timeb.h>

int ftime(struct timeb *tp);

## ОПИСАНИЕ
Данная функция возвращает текущее время в секундах и миллисекундах, прошедших начиная с эпохи (Epoch), 1970-01-01 00:00:00 +0000 (UTC). Время возвращается в tp, определённой следующим образом:

```
struct timeb {

    time_t         time;

    unsigned short millitm;

    short          timezone;

    short          dstflag;
};
```

В данной структуре time — это количество секунд с начала эпохи; millitm — количество миллисекунд, прошедших после time секунд с начала эпохи. Поле timezone — локальный часовой пояс, измеряемый в минутах западнее Гринвича (отрицательные значения означают минуты восточнее Гринвича). Поле dstflag — флаг, ненулевое значение которого указывает, что в соответствующее время года используется летнее время.

В POSIX.1-2001 сказано, что содержимое полей timezone и dstflag не определено; не используйте их.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Эта функция всегда возвращает 0 (в POSIX.1-2001, а также в некоторых системах возвращается -1 при ошибке).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

ftime()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.2BSD, POSIX.1-2001. В POSIX.1-2008 спецификация ftime() удалена.

Эта функция устарела. Не используйте её. В случаях, когда достаточно секунд, можно использовать time(2); gettimeofday(2) позволяет работать с микросекундами; функция clock_gettime(3) позволяет работать с наносекундами, однако она пока ещё не очень широко распространена.

## ДЕФЕКТЫ
Ранние версии glibc2 работают некорректно и возвращают 0 в поле millitm; начиная с glibc 2.1.1 эта ошибка исправлена.

## СМОТРИТЕ ТАКЖЕ
gettimeofday(2), time(2)


ftok

title: ftok(3)

text:
# ftok(3)

## ИМЯ
ftok - преобразует путь и идентификатор проекта в ключ System V IPC

## ОБЗОР

```
#include <sys/types.h>
#include <sys/ipc.h>
```

key_t ftok(const char *pathname, int proj_id);

## ОПИСАНИЕ
Функция ftok() использует отличительные свойства (identity) файла с именем pathname (которое должно указывать на существующий и доступный файл) и младшие 8 бит аргумента proj_id (который должен быть не равен нулю) для генерации ключа System V IPC key_t, который пригоден для работы с msgget(2), semget(2) или shmget(2).

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается сгенерированное значение key_t. При ошибке возвращается -1, а в переменную errno записывается код ошибки согласно системному вызову stat(2).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

ftok()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

## ЗАМЕЧАНИЯ
В некоторых старых системах прототип выглядел как:

```
key_t ftok(char *pathname, char proj_id);
```

В наши дни proj_id имеет тип int, хотя, как правило, по-прежнему из него используется только 8 бит. Обычно, при вызове этой функции в качестве proj_id передаётся символ ASCII, именно поэтому поведение функции считается не определённым, если proj_id равен нулю.

Естественно, не гарантируется, что возвращаемый key_t уникален. Обычно производится объединение указанного байта proj_id с младшими 16 битами номера inode и младшими 8 битам номера устройства в 32-битный результат. Легко могут возникать повторения, например между файлами на /dev/hda1 и файлами на /dev/sda1.

## СМОТРИТЕ ТАКЖЕ
msgget(2), semget(2), shmget(2), stat(2), sysvipc(7)


fts

title: fts(3)

summary: обход файловой

text:
# fts(3)

## ИМЯ
fts, fts_open, fts_read, fts_children, fts_set, fts_close - обход файловой иерархии

## ОБЗОР

```
#include <sys/types.h>
#include <sys/stat.h>
#include <fts.h>
```

```
FTS *fts_open(char * const *path_argv, int options,
              int (*compar)(const FTSENT **, const FTSENT **));
```

```
FTSENT *fts_read(FTS *ftsp);
```

```
FTSENT *fts_children(FTS *ftsp, int instr);
```

```
int fts_set(FTS *ftsp, FTSENT *f, int instr);
```

```
int fts_close(FTS *ftsp);
```

## ОПИСАНИЕ
Функции fts созданы для обхода файловой иерархии. Обзорное описание: функция fts_open() возвращает «описатель» (с типом FTS *), который указывает на «поток» файловой иерархии. Далее он используется другими функциями fts. Функция fts_read() возвращает указатель на структуру, описывающую один из файлов в файловой иерархии. Функция fts_children() возвращает указатель на связанный список структур, каждая из которых описывает один из файлов, содержащихся в каталоге иерархии.

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

В файле <fts.h> определены две структуры (связанные с ними типы). Первая — структура FTS, представляющая саму иерархию файлов. Вторая — структура FTSENT, представляющая файл в иерархии файлов. Обычно, структура FTSENT возвращается для каждого файла в файловой иерархии. В этой справочной странице понятия «файл» и «структура FTSENT» взаимозаменяемы.

Структура FTSENT содержит поля, описывающие файл. На имеет, по меньшей мере, следующие поля (есть и дополнительные поля, но для реализации они должны считаться скрытыми):

```
typedef struct _ftsent {

    unsigned short  fts_info;     /* флаги для структуры FTSENT */

    char           *fts_accpath;  /* путь доступа */

    char           *fts_path;     /* начальный путь */

    short           fts_pathlen;  /* strlen(fts_path) +

                                     strlen(fts_name) */

    char           *fts_name;     /* имя файла */

    short           fts_namelen;  /* strlen(fts_name) */

    short           fts_level;    /* глубина (от -1 до N) */

    int             fts_errno;    /* файловый errno */

    long            fts_number;   /* локальное числовое значение */

    void           *fts_pointer;  /* локальное значение адреса */

    struct _ftsent *fts_parent;   /* родительский каталог */

    struct _ftsent *fts_link;     /* структура следующего файла */

    struct _ftsent *fts_cycle;    /* циклическая структура */

    struct stat    *fts_statp;    /* информация stat(2) */
} FTSENT;
```

Эти поля определены следующим образом:

fts_info

Одно из следующих значений описывает возвращённую структуру FTSENT и файл, который она представляет. За исключением каталогов без ошибок (FTS_D), все эти элементы являются конечными, то есть они не будут повторно обходиться, а их потомки не будут обходиться вообще.

FTS_D

Каталог, посещаемый в прямом порядке.

FTS_DC

Каталог, вызвавший зацикливание в дереве (также будет заполнено поле fts_cycle структуры FTSENT).

FTS_DEFAULT

Любая структура FTSENT, представляющая тип файла, неявно описываемый одним из других значений fts_info.

FTS_DNR

Каталог, который не может быть прочитан. Это значение возвращается при ошибке, и поле fts_errno будет заполнено тем, что вызвало ошибку.

FTS_DOT

Файл с именем «.» или «..», который не был указан в качестве имени файла в fts_open() (смотрите FTS_SEEDOT).

FTS_DP

Каталог, посещаемый в обратном порядке. Содержимое структуры FTSENT будет неизменно, как если бы он посещался в прямом порядке, то есть значение поля fts_info равно FTS_D.

FTS_ERR

Это значение возвращается при ошибке, и поле fts_errno будет заполнено тем, что вызвало ошибку.

FTS_F

Обычный файл.

FTS_NS

Файл, для которого нет доступной информации по stat(2). Содержимое поля fts_statp не определено. Это значение возвращается при ошибке, и поле fts_errno будет заполнено тем, что вызвало ошибку.

FTS_NSOK

Файл, для которого не запрашивалась информация с помощью stat(2). Содержимое поля fts_statp не определено.

FTS_SL

Символьная ссылка.

FTS_SLNONE

Символьная ссылка, указывающая на несуществующий объект. В поле fts_statp содержится ссылка на информацию о свойствах самой символьной ссылки.

fts_accpath

Путь к файлу относительно текущего каталога.

fts_path

Путь к файлу относительно начального каталога обхода. Этот путь содержит в себе путь (как префикс), указанный в fts_open().

fts_pathlen

Сумма длин строк, на которые ссылается fts_path и fts_name.

fts_name

Имя файла.

fts_namelen

Длина строки, на которую ссылается fts_name.

fts_level

Глубина погружения в дерево иерархии, от -1 до N, на которой был обнаружен файл. Структура FTSENT, представляющая родительский каталог обхода (или начальный каталог), обозначена как -1, а структура FTSENT для самой начальной точки поиска обозначена как 0.

fts_errno

Если при возврате структуры FTSENT функцией fts_children() или fts_read() её поле fts_info равно FTS_DNR, FTS_ERR или FTS_NS, то в поле fts_errno содержится номер ошибки (то есть значение errno), обозначающее причину ошибки. В других случаях, содержимое поля fts_errno не определено.

fts_number

Это поле создано для использования пользовательским приложением и не изменяется функциями fts. При инициализации оно устанавливается в 0.

fts_pointer

Это поле создано для использования пользовательским приложением и не изменяется функциями fts. При инициализации оно устанавливается в NULL.

fts_parent

Указатель на структуру FTSENT, которая ссылается на файл в иерархии непосредственно над текущим файлом, то есть на каталог, членом которого является текущий файл. Родительский каталог начальной точки поиска также может быть доступен, однако инициализируются только поля fts_level, fts_number и fts_pointer.

fts_link

При возврате функции fts_children() поле fts_link указывает на следующую структуру в связанном списке (заканчивающемся NULL) содержимого каталога. В другим случаях содержимое поля fts_link не определено.

fts_cycle

Если каталог вызывает зацикливание иерархии (смотрите FTS_DC), либо из-за жёсткой ссылки между двумя каталогами, либо из-за символьной ссылки, указывающей на каталог, то поле fts_cycle будет указывать на структуру FTSENT в иерархии, которая ссылается на тот же файл, что и текущая структура FTSENT. В других случаях содержимое поля fts_cycle не определено.

fts_statp

Указатель на информацию о файле, полученную с помощью stat(2).

Для всех путей всех файлов в иерархии используется единый буфер. Следовательно, поля fts_path и fts_accpath гарантировано завершаются null только для файла, который был возвращён fts_read() последним. Для использования этих полей для обращения к любым файлам, представленным другими структурами FTSENT необходимо, чтобы буфер пути был изменён в соответствии с информацией, содержащейся в поле fts_pathlen структуры FTSENT. Любое изменение должно быть обратно восстановлено перед дальнейшими попытками вызова fts_read(). Поле fts_name всегда завершается null.

### fts_open()
Функция fts_open() ожидает указатель на массив символьных указателей, обозначающих один или несколько путей, образующих логическую файловую иерархию, по которой будет проводиться обход. Массив должен заканчиваться указателем null.

Есть несколько флагов, должен быть указан хотя бы один (либо FTS_LOGICAL, либо FTS_PHYSICAL). Флаги, выбираемые с помощью логического объединения, имеют следующие значения:

FTS_COMFOLLOW

Этот флаг принуждает перемещаться по любой символьной ссылке, определённой как корневой путь, несмотря на то, определён или нет флаг FTS_LOGICAL.

FTS_LOGICAL

Этот флаг принуждает функции fts возвращать структуры FTSENT для целей символьных ссылок вместо самих символьных ссылок. Если этот флаг включён, то единственные символьные ссылки, для которых приложениям выдаются структуры FTSENT — это ссылки, указывающие на несуществующие файлы. Также для работы функции fts_open() должны быть указаны FTS_LOGICAL или FTS_PHYSICAL.

FTS_NOCHDIR

С целью оптимизации производительности функции fts меняют каталоги, по которым они следуют по файловой иерархии. Это имеет один побочный эффект — приложения не могут точно определить, в каком каталоге они находятся во время перемещения по дереву. Флаг FTS_NOCHDIR выключает такую оптимизацию, и функции fts не будут менять текущий каталог. Заметим, что приложения тоже не должны изменять свой текущий каталог и пытаться получить доступ к файлам, пока не указан флаг FTS_NOCHDIR и функции fts_open() не переданы абсолютные пути в качестве параметров.

FTS_NOSTAT

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

FTS_PHYSICAL

Этот флаг заставляет функции fts выдавать структуру FTSENT самих символьных ссылок, а не файлов, на которые они указывают. Если этот флаг установлен, то для всех символьных ссылок в файловой иерархии приложениям возвращаются структуры FTSENT. Для работы функции fts_open() также должны присутствовать FTS_LOGICAL или FTS_PHYSICAL.

FTS_SEEDOT

По умолчанию, все файлы с именами «.» или «..», обнаруженные в файловой иерархии, игнорируются, если они не указаны как параметры пути в fts_open(). Данный флаг принуждает функции fts для таких файлов возвращать структуры FTSENT.

FTS_XDEV

Этот флаг предотвращает функции fts от вхождения в каталоги, которые имеют номер устройства, отличный от файла, с которого начался обход.

В параметре compar() указывается определяемая пользователем функция, которая может использоваться для упорядочивания обхода иерархии. В качестве параметров ей требуется два указателя на указатели на структуры FTSENT, и она должна возвращать отрицательное значение, ноль или положительное значение для того, чтобы показать, расположен ли файл, на который указывает первый параметр, перед (относительно текущего упорядочивания), на одном уровне или после файла, на который указывает второй параметр. Поля fts_accpath, fts_path и fts_pathlen структур FTSENT могут быть никогда не использованы при таком сравнении. Если значение поля fts_info равно FTS_NS или FTS_NSOK, то поле fts_statp может не использоваться. Если значение параметра compar() равно NULL, то порядок обхода каталогов определяется параметрами, указанными в path_argv для корневых путей, и в порядке, перечисленном в каталоге, для всего остального.

### fts_read()
Функция fts_read() возвращает указатель на структуру FTSENT, описывающую файл в иерархии. Каталоги (корректно считанные и не образующие зацикливаний), посещаются как минимум дважды — первый раз в прямом прохождении и второй раз в обратном. Все остальные файлы посещаются минимум один раз (жёсткие ссылки между каталогами, не образующие зацикливаний, или символьные ссылки на символьные ссылки могут привести к тому, что файлы будут посещаться более одного раза, а каталоги более двух раз).

Когда все члены иерархии возвращены, fts_read() возвращает NULL и устанавливает внешнюю переменную errno равной 0. Если происходит ошибка, не имеющая отношения к файлу в иерархии, fts_read() возвращает NULL и устанавливает errno в соответствующее значение. Если происходит ошибка, связанная с возвращённым файлом, то возвращается указатель на структуру FTSENT, а errno может быть установлена в какое-то значение (а может и не быть, смотрите fts_info).

Структуры FTSENT, возвращаемые fts_read(), могут быть перезаписаны после вызова fts_close() в том же файловом потоке иерархии или после вызова fts_read() в том же файловом потоке иерархии, если они не представляют файл типа «каталог»; в этом случае они не будут перезаписаны до тех пор, пока функция fts_read() не вернёт структуру FTSENT при выполнении обхода в обратном порядке.

### fts_children()
Функция fts_children() возвращает указатель на структуру FTSENT, описывающую первый член связанного списка (оканчивающегося NULL) файлов в каталоге, представленного структурой FTSENT, возвращённой fts_read() последней. Список связан через поле fts_link структуры FTSENT, и упорядочен определённой пользователем функцией сравнения, если таковая существует. Повторные вызовы fts_children() будут пересоздавать этот связанный список.

В особом случае, если fts_read() ещё не вызывалась для иерархии, то fts_children() возвратит указатель на файлы в логическом каталоге, заданном fts_open(), т.е. параметры, переданные функции fts_open(). В противном случае, если последняя возвращённая fts_read() структура FTSENT не является каталогом, просмотренном в прямом порядке, и не каталогом файлов, то fts_children() возвратит NULL и установит errno равным 0. Если произойдёт ошибка, то fts_children() возвратит NULL и установит errno в соответствующее значение.

Структура FTSENT, возвращаемая fts_children(), может быть перезаписана после вызова fts_children(), fts_close() или fts_read() в том же файловом потоке иерархии.

Параметр instr может принимать значение нуля или одного из следующих значений:

FTS_NAMEONLY

Необходимы только имена файлов. Содержимое всех полей в возвращаемом связанном списке структур не определено, за исключением полей fts_name и fts_namelen.

### fts_set()
Функция fts_set() позволяет пользовательскому приложению определять дальнейшую обработку файла f в потоке ftsp. При успешном выполнении функция fts_set() возвращает 0 и -1 при ошибке.

Значением аргумента instr может быть 0 («ничего не делать») или одно из следующих значений:

FTS_AGAIN

Повторно посетить файл; файл любого типа может быть повторно посещён. Последующий вызов fts_read() возвратит файл, к которому идёт обращение. Поля fts_stat и fts_info структуры будут переинициализированы в этот момент, но никакие поля больше не будут изменены. Этот параметр значим только для последнего возвращённого файла из fts_read(). Обычно его используют при посещении каталогов в обратном порядке; в этом случае каталог посещается повторно (в прямом и обратном порядке), а также все его потомки.

FTS_FOLLOW

Рассматриваемый файл должен быть символьной ссылкой. Если рассматриваемый файл — последний возвращённый fts_read(), то следующий вызов fts_read() возвратит файл с изменёнными полями fts_info и fts_statp, в которых будут отражать повторно инициализированные данные цели символьной ссылки, а не самой символьной ссылки. Если рассматриваемый файл — последний возвращённый fts_children(), то поля fts_info и fts_statp структуры при возврате из fts_read() будут отражать данные цели символьной ссылки, а не самой символьной ссылки. В любом случае, если цель символьной ссылки не существует, то поля возвращаемой структуры не будут меняться, а поле fts_info будет равно FTS_SLNONE.

Если цель ссылки — каталог, то выполняется возврат при прямом прохождении, после него возврат всех его потомков, после чего выполняется возврат в обратном порядке.

FTS_SKIP

Не посещать потомков данного файла. Файл может быть одним из последних возвращённых либо fts_children(), либо fts_read().

### fts_close()
Функция fts_close() закрывает поток файловой иерархии, на который указывает ftsp, и делает текущим каталогом тот, который был до вызова fts_open() для открытия ftsp. При успешном выполнении функция fts_close() возвращает 0 и -1 при ошибке.

## ОШИБКИ
Функция fts_open() может завершиться с ошибкой и назначить переменной errno значения, перечисленные в open(2) и malloc(3).

Функция fts_close() может завершиться с ошибкой и назначить переменной errno значения, перечисленные в chdir(2) и close(2).

Функции fts_read() и fts_children() могут завершиться с ошибкой и назначить переменной errno значения, перечисленные в chdir(2), malloc(3), opendir(3), readdir(3) и stat(2).

Кроме того, функции fts_children(), fts_open() и fts_set() могут завершиться с ошибкой и назначить переменной errno следующие значения:

EINVAL

Некорректное значение options или instr.

## ВЕРСИИ
Эти функции доступны в версиях Linux начиная с glibc2.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

fts_open(), fts_set(), fts_close()

Безвредность в нитях

MT-Safe

fts_read(), fts_children()

Безвредность в нитях

MT-Unsafe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD.

## ДЕФЕКТЫ
В версиях glibc до 2.23 весь описанный здесь программный интерфейс небезопасен, если компиляция программы производится с программным интерфейсом LFS (например, когда компиляция выполняется с -D_FILE_OFFSET_BITS=64).

## СМОТРИТЕ ТАКЖЕ
find(1), chdir(2), stat(2), ftw(3), qsort(3)


ftw

title: ftw(3)

summary: обход файлового дерева

text:
# ftw(3)

## ИМЯ
ftw, nftw - обход файлового дерева

## ОБЗОР

```
#include <ftw.h>
```

```
int nftw(const char *dirpath,
        int (*fn) (const char *fpath, const struct stat *sb,
                   int typeflag, struct FTW *ftwbuf),
        int nopenfd, int flags);
```

```
#include <ftw.h>
```

```
int ftw(const char *dirpath,
        int (*fn) (const char *fpath, const struct stat *sb,
                   int typeflag),
        int nopenfd);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

nftw(): _XOPEN_SOURCE >= 500

## ОПИСАНИЕ
Функция nftw() обходит дерево каталогов, начиная с указанного в dirpath, и для каждого элемента дерева однократно вызывает fn(). По умолчанию каталоги обрабатываются раньше файлов и подкаталогов, которые в них содержатся (предварительный обход).

Чтобы избежать использования всех файловых дескрипторов вызывающего процесса, в nopenfd задаётся максимальное количество одновременно открываемых nftw() каталогов. Когда это количество превышается, работа nftw() немного замедляется, так как каталоги будут закрываться и снова открываться. Функция nftw() использует не более одного файлового дескриптора для работы с каждым уровнем дерева каталогов.

Для каждого найденного элемента дерева nftw() вызывает функцию fn() с четырьмя аргументами: fpath, sb, fpath и ftwbuf. В fpath указывается полное имя элемента в виде, или пути относительно рабочего каталога вызывающего процесса на момент вызова nftw() (если dirpath указан в виде относительного пути), или абсолютного пути (если dirpath указан в виде абсолютного пути). В sb задаётся указатель на структуру stat, возвращаемую вызовом stat(2) для fpath.

Аргумент typeflag, передаваемый в fn(), представляет собой целое число, которое может быть одним из следующих значений:

FTW_F

fpath обычный файл

FTW_D

fpath каталог

FTW_DNR

fpath каталог, который не может быть прочитан

FTW_DP

fpath является каталогом, и в flags установлен FTW_DEPTH (если FTW_DEPTH отсутствует в flags, то каталоги всегда будут просматриваться с typeflag равным FTW_D). Обработаны все файлы и подкаталоги в fpath.

FTW_NS

Вызов stat(2) завершился с ошибкой для fpath, который не является символьной ссылкой. Вероятно, проблема в том, что вызывающий имеет право на чтение родительского каталога, и поэтому файл с именем fpath доступен, но не имеет права выполнения, и поэтому файл недоступен для stat(2). Содержимое буфера, указываемого sb, не определено.

FTW_SL

fpath является символьной ссылкой и в flags установлен FTW_PHYS.

FTW_SLN

Значение fpath является символьной ссылкой, указывающей на несуществующий файл (это может произойти, только если не установлен флаг FTW_PHYS). В большинстве реализаций в этом случае аргумент sb, переданный fn(), содержит информацию, возвращаемую вызовом lstat(2) для символьной ссылки. Подробней для Linux смотрите в разделе ДЕФЕКТЫ.

Четвёртый аргумент (ftwbuf), передаваемый nftw() при вызове fn(), является структурой типа FTW:

```
struct FTW {

    int base;

    int level;
};
```

base — смещение на имя файла (т.е. базовая часть) в пути, заданном в fpath. level — глубина fpath в дереве каталогов относительно корня дерева (dirpath имеет глубину 0).

Для остановки обхода дерева fn() возвращает ненулевое значение; оно станет возвращаемым значением для nftw(). Пока fn() возвращает 0, nftw() будет продолжать свой поиск до полного обхода дерева (в этом случае она возвратит ноль), или пока не возникнет ошибка (например, из-за malloc(3)). В этом случае функция возвратит значение -1.

Так как nftw() использует динамические структуры данных, то единственным безопасным способом для выхода из процесса обхода дерева будет возврат ненулевого значения из fn(). Для завершения обхода по сигналу без утечек памяти в обработчике нужно устанавливать глобальный флаг, проверяемый fn(). Не используйте longjmp(3) кроме как для завершения программы.

Значение аргумента flags в nftw() составляется логическим сложением 0 или нескольких следующих флагов:

FTW_ACTIONRETVAL (начиная с glibc 2.3.3)

Если этот флаг, имеющийся только в glibc, не задан, то nftw() по другому обрабатывает полученное от fn() значение. Вызов fn() должен возвращать одно из следующих значений:

FTW_CONTINUE

Указывает nftw() продолжать обычную работу.

FTW_SKIP_SIBLINGS

При возврате этого значения родственные элементы пропускаются и продолжается обход родителя.

FTW_SKIP_SUBTREE

Если fn() вызывается для элемента, являющегося каталогом (typeflag равно FTW_D), то объекты внутри каталога не будут переданы fn() в качестве аргументов. nftw() продолжит обход со следующего родственного элемента каталога.

FTW_STOP

Заставляет nftw() немедленно завершить работу со значением FTW_STOP.

В будущем могут появиться другие возвращаемые значения для новых действий; fn() не должна возвращать значений, отличных от перечисленных выше.

Чтобы получить определение FTW_ACTIONRETVAL из <ftw.h>, должен быть определён макрос тестирования свойств _GNU_SOURCE.

FTW_CHDIR

Если установлен этот флаг, то будет выполняться chdir(2) для каждого каталога перед обработкой его содержимого. Это полезно, если программе требуется выполнить какое-то действие в каталоге, в котором расположен fpath (наличие данного флага не влияет на путь, который передаётся в fpath аргумента fn).

FTW_DEPTH

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

FTW_MOUNT

Если установлен этот флаг, то оставаться в пределах одной файловой системы (т.е. не переходить в другую точку монтирования).

FTW_PHYS

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

Если FTW_PHYS не задан, но задан FTW_DEPTH, то функция fn() никогда не будет вызвана для каталога, который является потомком самого себя.

### ftw()
Функция ftw() является устаревшей и предоставляет только часть возможностей nftw(). Основные отличия:

- В ftw() нет аргумента flags. Она действует также, как если бы nftw() вызвали со значением flags равным нулю.

- Функции обратного вызова fn() не передаётся четвёртый аргумент.

- Диапазон значений, передаваемый в аргументе typeflag для fn() меньше: FTW_F, FTW_D, FTW_DNR, FTW_NS и (возможно) FTW_SL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0 и -1 при ошибке.

Если fn() возвращает ненулевое значение, то обход дерева прекращается и значение, полученное от fn(), возвращается в качестве результата ftw() или nftw().

Если nftw() вызывается с флагом FTW_ACTIONRETVAL, то для прекращения обхода дерева fn() должна вернуть ненулевое значение FTW_STOP, и это значение возвращается в качестве результата nftw().

## ВЕРСИИ
Функция nftw() доступна в glibc начиная с версии 2.1.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

nftw()

Безвредность в нитях

MT-Safe cwd

ftw()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, SUSv1. В POSIX.1-2008 функция ftw() помечена как устаревшая.

## ЗАМЕЧАНИЯ
В POSIX.1-2008 отмечено, что результат непредсказуем, если fn не сохраняет текущий рабочий каталог.

Функция nftw() и использование FTW_SL с ftw() впервые появились в SUSv1.

В некоторых реализациях (например, glibc), ftw() никогда не использует FTW_SL, в других системах FTW_SL возникает только для символьных ссылок, которые не указывают на существующий файл, или даже ftw() будет использовать FTW_SL для каждой символьной ссылки. Если fpath — символьная ссылка и stat(2) завершается с ошибкой, то следуя POSIX.1-2008 нельзя понять что передаётся в typeflag: FTW_NS или FTW_SL. Для предсказуемости результатов используйте nftw().

## ДЕФЕКТЫ
В спецификации POSIX.1 на nftw() отмечено, что при передаче FTW_NS в аргументе typeflag для fn(), содержимое буфера, на который указывает аргумент sb, не определено. Стандарт не утверждает это для случая, когда в typeflag передаётся FTW_SLN и подразумевается, что содержимое буфера, на который указывает sb, является определённым. И действительно, этот так для большинства реализаций: буфер, на который указывает sb, содержит результаты работы lstat(2) для символьной ссылки. В ранних glibc поведение было тем же самым. Однако начиная с glibc 2.4 содержимое буфера, на который указывает sb, не определено при передаче FTW_SLN в typeflag. Это изменение, вероятно, вызовет непреднамеренную регрессию, но (пока) не ясно, будет ли восстановлено поведение, предоставляемое первоначальной реализацией glibc (и другими реализациями).

## ПРИМЕР
Следующая программа обходит дерево каталогов начиная с пути, указанном в первом аргументе командой строки или начиная с текущего каталога, если аргумент не указан. Она отображает различную информацию о каждом файле. Во втором параметре можно указать символы, которые управляют содержимым аргумента flags у nftw().

### Исходный код программы

```
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
static int
display_info(const char *fpath, const struct stat *sb,

             int tflag, struct FTW *ftwbuf)
{

    printf("%-3s %2d ",

            (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :

            (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :

            (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :

            (tflag == FTW_SLN) ? "sln" : "???",

            ftwbuf->level);

    if (tflag == FTW_NS)

        printf("-------");

    else

        printf("%7jd", (intmax_t) sb->st_size);

    printf("   %-40s %d %s\n",

            fpath, ftwbuf->base, fpath + ftwbuf->base);

    return 0;           /* говорит nftw() продолжать */
}
int
main(int argc, char *argv[])
{

    int flags = 0;

    if (argc > 2 && strchr(argv[2], 'd') != NULL)

        flags |= FTW_DEPTH;

    if (argc > 2 && strchr(argv[2], 'p') != NULL)

        flags |= FTW_PHYS;

    if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)

            == -1) {

        perror("nftw");

        exit(EXIT_FAILURE);

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
stat(2), fts(3), readdir(3)


futimes

title: futimes(3)

summary: изменяют метки времени файла

text:
# futimes(3)

## ИМЯ
futimes, lutimes - изменяют метки времени файла

## ОБЗОР

```
#include <sys/time.h>
```

```
int futimes(int fd, const struct timeval tv[2]);
```

```
int lutimes(const char *filename, const struct timeval tv[2]);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

futimes(), lutimes():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE

## ОПИСАНИЕ
Функция futimes() изменяет время доступа и изменения файла также как это делает utimes(2); единственное отличие в том, что файл чьи временные метки изменяются, указывается в виде файлового дескриптора, fd, а не в виде пути.

Функция lutimes() изменяет время доступа и изменения файла также как это делает utimes(2); единственное отличие в том, что если filename является символьной ссылкой, то ссылка не разыменовывается — изменяются метки времени самой ссылки.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

## ОШИБКИ
Возникают те же ошибки что и для utimes(2), а также дополнительно для futimes():

EBADF

Значение fd не является правильным файловым дескриптором.

ENOSYS

Нет доступа к файловой системе /proc.

Для lutimes() может возникать следующая дополнительная ошибка:

ENOSYS

Ядро не поддерживает этот вызов; требуется Linux версии 2.6.22 или новее.

## ВЕРСИИ
Функция futimes() доступна в glibc начиная с версии 2.3. Функция lutimes() доступа в glibc начиная с версии 2.6, и реализована на основе системного вызова utimensat(2), который поддерживается в ядре начиная с версии 2.6.22.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

futimes(), lutimes()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции не определены ни в одном стандарте. Помимо Linux, они доступны только в некоторых BSD.

## СМОТРИТЕ ТАКЖЕ
utime(2), utimensat(2), symlink(7)


fwide

title: fwide(3)

text:
# fwide(3)

## ИМЯ
fwide - задаёт и определяет ориентацию потока FILE

## ОБЗОР

```
#include <wchar.h>
```

```
int fwide(FILE *stream, int mode);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

fwide():

_XOPEN_SOURCE >= 500 || _ISOC99_SOURCE ||

_POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Если значение mode равно нулю, то функция fwide() определяет текущую ориентацию потока stream. Возвращается положительное значение, если stream ориентирован на широкие символы, то есть ввод/вывод широких символов разрешён, а ввод/вывод обычных символов запрещён. Возвращается отрицательное значение, если stream ориентирован на работу с байтами, то есть разрешён ввод/вывод обычных символов (char), а ввод/вывод широких символов запрещён. Возвращается ноль, если stream пока не имеет ориентации; в этом случае следующая операция ввода/вывода может поменять ориентацию (например, на байтовую, если производится операция ввода/вывода символов, или на широкие символы, если выполняется операция ввода/вывода широких символов).

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

Если значение mode не равно нулю, то функция fwide() сначала попытается установить ориентацию stream (на широкие символы, если mode больше 0, или на байты, если mode меньше 0). Затем возвращается значение, отражающее текущую ориентацию, как указано выше.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция fwide() возвращает ориентацию потока после возможного её изменения. Возвращаемое положительное значение означает ориентацию на широкие символы. Возвращаемое отрицательное значение означает ориентацию на байты. Возвращаемое значение 0 означает неопределённость.

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

## ЗАМЕЧАНИЯ
Вывод широких символов в поток, ориентированный на байтовые операции, может быть осуществлён с помощью функции fprintf(3) с директивами %lc и %ls.

Вывод символов в поток, ориентированный на операции с широкими символами, может быть осуществлён с помощью функции fwprintf(3) с директивами %c и %s.

## СМОТРИТЕ ТАКЖЕ
fprintf(3), fwprintf(3)


gamma

title: gamma(3)

summary: логарифм гамма\-функции

text:
# gamma(3)

## ИМЯ
gamma, gammaf, gammal - логарифм гамма-функции

## ОБЗОР
\#include <math.h>

double gamma(double x);

float gammaf(float x);

long double gammal(long double x);

Компонуется при указании параметра -lm.

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

gamma():

_XOPEN_SOURCE

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

gammaf(), gammal(): _XOPEN_SOURCE >= 600 || (_XOPEN_SOURCE && _ISOC99_SOURCE)

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Данные функции устарели. Используйте вместо них, по возможности, tgamma(3) либо lgamma(3).

Определение гамма-функции смотрите в tgamma(3).

### Версия *BSD
В libm из 4.4BSD и некоторых версиях FreeBSD имеется функция gamma(), которая вычисляет гамма-функцию, как и ожидается.

### Версия glibc
В glibc есть функция gamma(), которая эквивалентна lgamma(3) и вычисляет натуральный логарифм гамма-функции.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Смотрите lgamma(3).

## ОШИБКИ
Смотрите lgamma(3).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

gamma(), gammaf(), gammal()

Безвредность в нитях

MT-Unsafe race:signgam

## СООТВЕТСТВИЕ СТАНДАРТАМ
Из-за различий в поведении в различных системах эта функция не попала ни в один современный стандарт. Она описана в SVID 2.

## ЗАМЕЧАНИЯ

### История
В 4.2BSD функция gamma() вычисляет ln(|Gamma(|x|)|), записывая знак Gamma(|x|) во внешнее целое signgam. В 4.3BSD было изменено имя на lgamma(3), и в справочной странице указано

"Через некоторое время имя gamma было восстановлено и использовано для гаммы-функции"

В действительности это произошло в 4.4BSD, где gamma() вычисляла гамма-функцию (без влияния на signgam). Однако, это случилось слишком поздно и теперь мы имеем tgamma(3), «настоящую» гамма-функцию.

## СМОТРИТЕ ТАКЖЕ
lgamma(3), signgam(3), tgamma(3)


gcvt

title: gcvt(3)

text:
# gcvt(3)

## ИМЯ
gcvt - преобразовать число с плавающей точкой в строку

## ОБЗОР

```
#include <stdlib.h>
```

```
char *gcvt(double number, int ndigit, char *buf);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

gcvt():

Начиная с glibc 2.12:

```
(_XOPEN_SOURCE >= 500) ! (_POSIX_C_SOURCE >= 200112L)

    || /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

    || /* в версии glibc <= 2.19: */ _SVID_SOURCE
```

До glibc 2.12:

_SVID_SOURCE || _XOPEN_SOURCE >= 500

## ОПИСАНИЕ
Функция gcvt() преобразует number в строку ASCII (с null в конце) минимальной длины и сохраняет результат в buf. Она выдаёт ndigit цифр со знаком в F или E формате, описанных в printf(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция gcvt() возвращает адрес строки, на которую указывает buf.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

gcvt()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Отмечена в POSIX.1-2001 как УСТАРЕВШАЯ. В POSIX.1-2008 спецификация gcvt() удалена, вместо них рекомендуется использовать sprintf(3) (однако snprintf(3) может быть предпочтительнее).

## СМОТРИТЕ ТАКЖЕ
ecvt(3), fcvt(3), sprintf(3)


title: get_nprocs_conf(3)

summary: возвращает количество процессоров

text:
# get_nprocs_conf(3)

## ИМЯ
get_nprocs, get_nprocs_conf - возвращает количество процессоров

## ОБЗОР
\#include <sys/sysinfo.h>

int get_nprocs(void);

int get_nprocs_conf(void);

## ОПИСАНИЕ
Функция get_nprocs_conf() возвращает количество процессоров, настроенных операционной системой.

Функция get_nprocs() возвращает количество процессоров, доступных в системе. Это значение может быть меньше чем возвращаемое get_nprocs_conf(), так как процессоры могут быть выключены (например, в системах с подключением на ходу).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Как указано в ОПИСАНИИ.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

get_nprocs(), get_nprocs_conf()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU.

## ЗАМЕЧАНИЯ
Текущая реализация этих функций не оптимальна, так как при каждом вызове открываются и обрабатываются файлы в файловой системе /sys.

Следующие вызовы sysconf(3) возвращают тоже что и описанные здесь функции.

```
np = sysconf(_SC_NPROCESSORS_CONF);     /* настроенных процессоров */
np = sysconf(_SC_NPROCESSORS_ONLN);     /* доступных процессоров */
```

## ПРИМЕР
В следующем примере показано использование get_nprocs() и get_nprocs_conf().

```
#include <stdlib.h>
#include <stdio.h>
#include <sys/sysinfo.h>
int
main(int argc, char *argv[])
{

    printf("В системе настроено %d процессоров и "

            "%d процессоров доступно.\n",

            get_nprocs_conf(), get_nprocs());

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
nproc(1)


title: get_phys_pages(3)

text:
# get_phys_pages(3)

## ИМЯ
get_phys_pages, get_avphys_pages - возвращает количество физических страниц, а также количество доступных страниц

## ОБЗОР

```
#include <sys/sysinfo.h>
```

```
long int get_phys_pages(void);
long int get_avphys_pages(void);
```

## ОПИСАНИЕ
Функция get_phys_pages() возвращает общее количество физических страниц памяти, доступных в системе.

Функция get_avphys_pages() возвращает количество доступных в данный момент физических страниц памяти в системе.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают значение согласно ОПИСАНИЮ. При ошибке возвращается -1 и в errno записывается номер ошибки.

## ОШИБКИ
ENOSYS

Система не может предоставить требуемую информацию (возможно, из-за того, что не смонтирована файловая система /proc).

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU.

## ЗАМЕЧАНИЯ
Эти функции получают требуемую информацию из полей MemTotal и MemFree файла /proc/meminfo.

Следующие вызовы sysconf(3) предоставляют переносимый способ получения информации, возвращаемой этими функциями.

```
total_pages = sysconf(_SC_PHYS_PAGES); /* общее количество страниц */

    avl_pages = sysconf(_SC_AVPHYS_PAGES); /* количество доступных страниц */
```

## ПРИМЕР
В следующем примере показано использование get_phys_pages() и get_avphys_pages().

```
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysinfo.h>
int
main(int argc, char *argv[])
{

    printf("В этой системе %ld страниц физической памяти и "

            "доступно %ld страниц физической памяти.\n",

            get_phys_pages(), get_avphys_pages());

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
sysconf(3)