errno

title: errno(3)

summary: код последней ошибки

text:
# errno(3)

## ИМЯ
errno - код последней ошибки

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

## ОПИСАНИЕ
В заголовочном файле <errno.h> определяется целочисленная переменная errno, которая используется системными вызовами и некоторыми библиотечными функциями при ошибках для указания того, что именно произошло.

### errno
Значение errno имеет смысл только тогда, когда вызов возвратил ошибку (а именно: -1 — для большинства системных вызовов; NULL — для большинства библиотечных функций); при успешном выполнении функции также могут менять значение errno. Системные вызовы и библиотечные функции никогда не присваивают errno значение нуля.

Некоторые системные вызовы или библиотечные функции (например, getpriority(2)), при успешном выполнении возвращают -1. В этих случаях успешность выполнения можно отличить от ошибки присвоив errno значение нуля перед вызовом, и затем, если вызов вернул состояние, которое может указывать на ошибку, проверить, равно ли errno ненулевому значению.

Переменная errno определена в стандарте ISO C как изменяемое lvalue int и не объявляемая явно; errno может быть и макросом. Переменная errno является локальным значением нити; её изменение в одной нити не влияет на её значение в другой нити.

### Номера и имена ошибок
Все положительные числа считаются допустимыми номерами ошибок. В заголовочном файле <errno.h> определены символические имена для каждого номера возможной ошибки, который может появиться в errno.

Всем названиям ошибок, определённым в POSIX.1, должны соответствовать разные значения, за исключением EAGAIN и EWOULDBLOCK, которые могут быть одинаковыми. В Linux эти они имеют одинаковое значение на всех архитектурах.

В разных системах UNIX символическим именам ошибок назначены разные номера, и это верно даже в Linux для разных архитектур. Поэтому числовые значение не указаны в представленном далее списке имён ошибок. Для преобразования этих имён в текстовые сообщения об ошибках можно использовать функции perror(3) и strerror(3).

В любой системе Linux можно получить список всех символических имён ошибок и соответствующие им номера с помощью команды errno(1)) (является частью пакета moreutils):

```
$ errno -l
EPERM 1 Операция не позволена
ENOENT 2 Нет такого файла или каталога
ESRCH 3 Нет такого процесса
EINTR 4 Прерван системный вызов
EIO 5 Ошибка ввода/вывода
...
```

Команду errno(1) также можно использовать для поиска ошибок по имени или номеру, а также по строке, входящей в описание ошибки:

```
$ errno 2
ENOENT 2 Нет такого файла или каталога
$ errno ESRCH
ESRCH 3 Нет такого процесса
$ errno -s permission
EACCES 13 Отказано в доступе
```

### Список имён ошибок
В представленном далее списки символических имён ошибок у некоторых есть некоторые примечания:

- POSIX.1-2001: Имя определено в POSIX.1-2001, а также, если не указано обратного, в новых версиях POSIX.1.

- POSIX.1-2008: Имя определено в POSIX.1-2008, но отсутствует в более старых версиях POSIX.1.

- C99: Имя определено в C99. Ниже представлен список символических имён ошибок, определённых в Linux:

E2BIG

Слишком длинный список параметров (POSIX.1-2001).

EACCES

Доступ запрещён (POSIX.1-2001).

EADDRINUSE

Адрес уже используется (POSIX.1-2001).

EADDRNOTAVAIL

Адрес недоступен (POSIX.1-2001).

EAFNOSUPPORT

Семейство адресов не поддерживается (POSIX.1-2001).

EAGAIN

Ресурс временно недоступен (значение может быть равным EWOULDBLOCK) (POSIX.1-2001).

EALREADY

Соединение уже выполняется (POSIX.1-2001).

EBADE

Некорректный обмен.

EBADF

Неправильный дескриптор файла (POSIX.1-2001).

EBADFD

Некорректное состояние дескриптора файла.

EBADMSG

Неправильное сообщение (POSIX.1-2001).

EBADR

Неверный дескриптор запроса.

EBADRQC

Неверный код запроса.

EBADSLT

Некорректный слот.

EBUSY

Устройство или ресурс заняты (POSIX.1-2001).

ECANCELED

Операция отменена (POSIX.1-2001).

ECHILD

Отсутствуют дочерние процессы (POSIX.1-2001).

ECHRNG

Номер канала вне диапазона.

ECOMM

Ошибка связи при отправке.

ECONNABORTED

Соединение было прервано (POSIX.1-2001).

ECONNREFUSED

В соединении отказано (POSIX.1-2001).

ECONNRESET

Соединение сброшено другой стороной (POSIX.1-2001).

EDEADLK

Предотвращена тупиковая ситуация при обращении к ресурсу (POSIX.1-2001).

EDEADLOCK

На большинстве архитектур является синонимом EDEADLK. На некоторых архитектурах (например, Linux MIPS, PowerPC, SPARC), это отдельный код ошибки «Ошибка перекрёстной блокировки файла».

EDESTADDRREQ

Требуется указать адрес назначения (POSIX.1-2001).

EDOM

Математический аргумент вне области определения функции (POSIX.1, C99).

EDQUOT

Превышена дисковая квота (POSIX.1-2001).

EEXIST

Файл существует (POSIX.1-2001).

EFAULT

Неправильный адрес (POSIX.1-2001).

EFBIG

Файл слишком велик (POSIX.1-2001).

EHOSTDOWN

Узел выключен.

EHOSTUNREACH

Узел недоступен (POSIX.1-2001).

EHWPOISON

В странице памяти аппаратная ошибка.

EIDRM

Идентификатор удалён (POSIX.1-2001).

EILSEQ

Неверный или неполный мультибайтный или широкий символ (POSIX.1, C99).

Этот текст взят из описания ошибки glibc; в POSIX.1 эта ошибка звучит как «Недопустимая последовательность байт».

EINPROGRESS

Операция выполняется (POSIX.1-2001).

EINTR

Прерванный вызов функции (POSIX.1-2001); смотрите signal(7).

EINVAL

Неверный аргумент (POSIX.1-2001).

EIO

Ошибка ввода/вывода (POSIX.1-2001).

EISCONN

Сокет подключён (POSIX.1-2001).

EISDIR

Это каталог (POSIX.1-2001).

EISNAM

Является файлом именованного типа.

EKEYEXPIRED

Ключ с истёкшим сроком.

EKEYREJECTED

Ключ был отвергнут службой.

EKEYREVOKED

Ключ был отозван.

EL2HLT

Уровень 2 остановлен.

EL2NSYNC

Уровень 2 не синхронизирован.

EL3HLT

Уровень 3 остановлен.

EL3RST

Уровень 3 сброшен.

ELIBACC

Невозможно получить доступ к нужной общей библиотеке.

ELIBBAD

Обращение к повреждённой общей библиотеке.

ELIBMAX

Попытка компоновки с слишком большим количеством общих библиотек.

ELIBSCN

Секция .lib в a.out повреждена

ELIBEXEC

Невозможно непосредственно выполнить общую библиотеку.

ELNRANGE

Число ссылок вне допустимого диапазона.

ELOOP

Слишком много уровней символьных ссылок (POSIX.1-2001).

EMEDIUMTYPE

Неправильный тип носителя.

EMFILE

Слишком много открытых файлов (POSIX.1-2001). Обычно, это происходит из-за превышения ограничения ресурса RLIMIT_NOFILE, описанного в getrlimit(2).

EMLINK

Слишком много ссылок (POSIX.1-2001).

EMSGSIZE

Сообщение слишком длинное (POSIX.1-2001).

EMULTIHOP

Попытка Multihop (POSIX.1-2001).

ENAMETOOLONG

Слишком длинное название файла (POSIX.1-2001).

ENETDOWN

Сеть не работает (POSIX.1-2001).

ENETRESET

Соединение прервано из-за сети (POSIX.1-2001).

ENETUNREACH

Сеть недоступна (POSIX.1-2001).

ENFILE

Слишком много открытых файлов в системе (POSIX.1-2001). В Linux это, вероятно, результат достижения ограничения /proc/sys/fs/file-max (смотрите proc(5)).

ENOANO

Не anode.

ENOBUFS

Недостаточно буферного пространства (POSIX.1 (часть XSI STREAMS)).

ENODATA

Сообщение в голове очереди чтения STREAM отсутствует (POSIX.1-2001).

ENODEV

Нет такого устройства (POSIX.1-2001).

ENOENT

Нет такого файла или каталога (POSIX.1-2001).

Обычно, эта ошибка является результатом указания несуществующего пути или отсутствия одного из компонентов каталогов пути, или указанный путь является символической ссылкой на несуществующий объект.

ENOEXEC

Ошибка формата выполняемого файла (POSIX.1-2001).

ENOKEY

Требуемый ключ недоступен.

ENOLCK

Нет доступных блокировок (POSIX.1-2001).

ENOLINK

Соединение было разорвано (POSIX.1-2001).

ENOMEDIUM

Носитель не найден.

ENOMEM

Недостаточно места/невозможно выделить память (POSIX.1-2001).

ENOMSG

Нет сообщения желаемого типа (POSIX.1-2001).

ENONET

Машина не в сети.

ENOPKG

Пакет не установлен.

ENOPROTOOPT

Протокол недоступен (POSIX.1-2001).

ENOSPC

На устройстве не осталось места (POSIX.1-2001).

ENOSR

Отсутствую ресурсы STREAM (POSIX.1 (часть XSI STREAMS)).

ENOSTR

Нет STREAM (POSIX.1 (часть XSI STREAMS)).

ENOSYS

Функция не реализована (POSIX.1-2001).

ENOTBLK

Требуется блочное устройство.

ENOTCONN

Сокет не подключён (POSIX.1-2001).

ENOTDIR

Не каталог (POSIX.1-2001).

ENOTEMPTY

Каталог не пуст (POSIX.1-2001).

ENOTRECOVERABLE

Состояние нельзя восстановить (POSIX.1-2008).

ENOTSOCK

Не сокет (POSIX.1-2001).

ENOTSUP

Операция не поддерживается (POSIX.1-2001).

ENOTTY

Неподходящая операция управления вводом/выводом (POSIX.1-2001).

ENOTUNIQ

Имя не уникально в сети.

ENXIO

Нет такого устройства или адреса (POSIX.1-2001).

EOPNOTSUPP

Операция не поддерживается на сокете (POSIX.1-2001).

(ENOTSUP и EOPNOTSUPP в Linux имеют одинаковые значения, но согласно POSIX.1 значения этих ошибок должны различаться.)

EOVERFLOW

Значение слишком велико для хранения в таком типе данных (POSIX.1-2001).

EOWNERDEAD

Владелец умер (POSIX.1-2008).

EPERM

Операция не позволена (POSIX.1-2001).

EPFNOSUPPORT

Семейство протоколов не поддерживается.

EPIPE

Обрыв канала (POSIX.1-2001).

EPROTO

Ошибка протокола (POSIX.1-2001).

EPROTONOSUPPORT

Протокол не поддерживается (POSIX.1-2001).

EPROTOTYPE

Неверный тип протокола для сокета (POSIX.1-2001).

ERANGE

Результат слишком большой (POSIX.1, C99).

EREMCHG

Удалённый адрес был изменён.

EREMOTE

Это удалённый объект.

EREMOTEIO

Ошибка удалённого ввода/вывода.

ERESTART

Прерванный системный вызов следует перезапустить.

ERFKILL

Операция не позволяется из-за RF-kill.

EROFS

Файловая система доступна только для чтения (POSIX.1-2001).

ESHUTDOWN

Невозможно отправить данные после выключения конечной точки передачи.

ESPIPE

Недопустимое перемещение (POSIX.1-2001).

ESOCKTNOSUPPORT

Тип сокета не поддерживается.

ESRCH

Нет такого процесса (POSIX.1-2001).

ESTALE

Неактуальный дескриптор файла (POSIX.1-2001).

Эта ошибка может возникать в NFS и других файловых системах.

ESTRPIPE

Ошибка потоков канала.

ETIME

Таймер истёк (POSIX.1 (часть XSI STREAMS)).

(в POSIX.1 описывается как «в ioctl(2) истекло время ожидания STREAM»)

ETIMEDOUT

Время ожидания соединения истекло (POSIX.1-2001).

ETOOMANYREFS

Слишком много ссылок: невозможно объединить.

ETXTBSY

Текстовый файл занят (POSIX.1-2001).

EUCLEAN

Структуру необходимо очистить.

EUNATCH

Драйвер протокола не подсоединён.

EUSERS

Слишком много пользователей.

EWOULDBLOCK

Операция приведёт к блокировке (значение может быть равно EAGAIN) (POSIX.1-2001).

EXDEV

Некорректная ссылка (POSIX.1-2001).

EXFULL

Обмен полон.

## ЗАМЕЧАНИЯ
Распространённая ошибка:

```
if (somecall() == -1) {

    printf("somecall() failed\n");

    if (errno == ...) { ... }
}
```

Здесь errno может больше не иметь значение результата последнего вызова somecall() (т.е., значение может измениться из-за printf(3)). Если значение errno важно, то его нужно сохранять между библиотечными вызовами:

```
if (somecall() == -1) {

    int errsv = errno;

    printf("somecall() failed\n");

    if (errsv == ...) { ... }
}
```

В некоторых древних системах файл <errno.h> отсутствовал или не объявлял errno, поэтому это нужно было делать вручную (например, extern int errno). Не делайте этого. Это давно уже не нужно, и вызовет проблемы с современными версиями библиотеки C.

## СМОТРИТЕ ТАКЖЕ
errno(1), err(3), error(3), perror(3), strerror(3)


error

package: man-pages-ru

title: error(3)

summary: функции вывода ошибок glibc

text:
# error(3)

## ИМЯ
error, error_at_line, error_message_count, error_one_per_line, error_print_progname - функции вывода ошибок glibc

## ОБЗОР

```
#include <error.h>
```

```
void error(int status, int errnum, const char *format, ...);
```

```
void error_at_line(int status, int errnum, const char *filename,
                   unsigned int linenum, const char *format, ...);
```

```
extern unsigned int error_message_count;
```

```
extern int error_one_per_line;
```

```
extern void (*error_print_progname) (void);
```

## ОПИСАНИЕ
Функция error() предназначена для сообщения об ошибках разного рода. Она сбрасывает stdout, а затем выводит в stderr имя программы, двоеточие, пробел, сообщение, задаваемое строкой format в формате printf(3) и, если значение errnum не равно нулю, второе двоеточие и пробел, за которыми выводится строка, возвращаемая вызовом strerror(errnum). Все аргументы, необходимые для format, должны указываться в списке аргументов после format. Вывод завершается символом новой строки.

Имя программы, выводимое error(), представляет собой значение глобальной переменной program_invocation_name(3). Первоначально, переменная program_invocation_name имеет то же значение что и argv[0] в функции main(). Значение этой переменной может быть изменено для показа в выводе error().

Если значение status не равно нулю, то error() вызывает exit(3) для завершения программы и это значение используется как код выхода.

Функция error_at_line() делает то же что и error(), но имеет дополнительные аргументы filename и linenum. Вывод аналогичен error(), но после имени программы записывается: двоеточие, значение filename, двоеточие и значение linenum. При вызове error_at_line() могут быть полезны значения препроцессора __LINE__ и __FILE__, но можно использовать и другие значения. Например, эти аргументы могут указывать на место во входном файле.

Если значение глобальной переменной error_one_per_line не равно нулю, то последовательность вызовов error_at_line() с тем же значением filename и linenum выводит только одно сообщение (первое).

В глобальной переменной error_message_count подсчитывается количество сообщений, которые были показаны с помощью error() и error_at_line().

Если глобальной переменной error_print_progname назначен адрес функции (т.е., её значение не равно NULL), то вместо показа в начале сообщения имени программы и двоеточия вызывается эта функция. Функция должна вывести нужную строку в stderr.

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

Интерфейс

Атрибут

Значение

error()

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

MT-Safe locale

error_at_line()

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

MT-Unsafe race: error_at_line/error_one_per_line locale

Доступна внутренняя переменная error_one_per_line (нет никакой синхронизации, но так как этот int используется только один раз, это не проблема) и, если error_one_per_line установлена в ненулевое значение, то становятся доступны для чтения и изменения без синхронизации внутренние статические переменные (невидимые пользователю), которые используются для хранения последнего напечатанного имени файла и номера строки; обновление не атомарно и происходит прежде, чем отключить отмену, поэтому может быть прервано только после того, как одна из этих двух переменных изменена. После этого error_at_line() очень похожа на error().

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции и глобальные переменные являются расширениями GNU, и они не должны использоваться в переносимых программах.

## СМОТРИТЕ ТАКЖЕ
err(3), errno(3), exit(3), perror(3), program_invocation_name(3), strerror(3)

branch: sisyphus


title: ether_aton(3)

text:
# ether_aton(3)

## ИМЯ
ether_aton, ether_ntoa, ether_ntohost, ether_hostton, ether_line, ether_ntoa_r, ether_aton_r - процедуры для работы с адресами ethernet

## ОБЗОР

```
#include <netinet/ether.h>
```

```
char *ether_ntoa(const struct ether_addr *addr);
```

```
struct ether_addr *ether_aton(const char *asc);
```

```
int ether_ntohost(char *hostname, const struct ether_addr *addr);
```

```
int ether_hostton(const char *hostname, struct ether_addr *addr);
```

```
int ether_line(const char *line, struct ether_addr *addr,
               char *hostname);
```

```
/* расширения GNU */

char *ether_ntoa_r(const struct ether_addr *addr, char *buf);
```

```
struct ether_addr *ether_aton_r(const char *asc,
                                struct ether_addr *addr);
```

## ОПИСАНИЕ
Функция ether_aton() преобразует 48-битный адрес узла Ethernet asc из стандартной записи в виде шестнадцатеричных-символов-и-двоеточий в двоичный код с сетевым порядком расположения байтов и возвращает указатель на него в статически выделенном буфере, который могут изменить любые последующие вызовы. Функция ether_aton() возвращает NULL, если адрес некорректен.

Функция ether_ntoa() преобразует адрес узла Ethernet addr, заданный значением с сетевым порядком байтов, в строку в стандартной форме записи в виде шестнадцатеричных-символов-и-двоеточий. Строка возвращается в статически выделяемом буфере, который перезаписывается при последующих вызовах.

Функция ether_ntohost() для заданного адреса Ethernet ищет соответствующее имя узла в файле /etc/ethers и возвращает ненулевое значение, если оно не может быть найдено.

Функция ether_hostton() для заданного имени узла ищет соответствующий адрес Ethernet в файле /etc/ethers и возвращает ненулевое значение, если он не может быть найден.

Функция ether_line() обрабатывает строку в формате файла /etc/ethers (адрес Ethernet, пробельный символ, имя узла; комментарий начинается с '#') и возвращает пару адрес/имя узла, или ненулевое значение, если строка не может быть обработана. Буфер, на который указывает hostname, должен быть достаточно большим, чтобы вместить, например, строку line.

Функции ether_ntoa_r() и ether_aton_r() являются безопасными для использования в нитях аналогами ether_ntoa() и ether_aton() соответственно, и не используют статических буферов.

Структура ether_addr определена в <net/ethernet.h>:

```
struct ether_addr {

    uint8_t ether_addr_octet[6];
}
```

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

Интерфейс

Атрибут

Значение

ether_aton(), ether_ntoa()

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

MT-Unsafe

ether_ntohost(), ether_hostton(), ether_line(), ether_ntoa_r(), ether_aton_r()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.3BSD, SunOS.

## ДЕФЕКТЫ
В glibc 2.2.5 и старее реализация ether_line() некорректна.

## СМОТРИТЕ ТАКЖЕ
ethers(5)


euidaccess

title: euidaccess(3)

text:
# euidaccess(3)

## ИМЯ
euidaccess, eaccess - проверяет эффективные права пользователя на файл

## ОБЗОР

```
#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <unistd.h>
```

```
int euidaccess(const char *pathname, int mode);
int eaccess(const char *pathname, int mode);
```

## ОПИСАНИЕ
Подобно access(2), euidaccess() проверяет права и существование файла, указанного в аргументе pathname. Однако, если access(2) выполняет проверку для реального идентификатора пользователя и группы процесса, то euidaccess() использует эффективные идентификаторы.

Значение mode представляет собой маску, состоящую из одного и более флагов R_OK, W_OK, X_OK и F_OK (значение описано в access(2)).

Функция eaccess() — ещё одно название euidaccess(), предоставляется для совместимости с некоторыми другими системами.

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

## ОШИБКИ
Аналогичны access(2).

## ВЕРСИИ
Функция eaccess() впервые появилась в glibc 2.4.

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

Интерфейс

Атрибут

Значение

euidaccess(), eaccess()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются нестандартными. В некоторых системах есть функция eaccess().

## ЗАМЕЧАНИЯ
Предупреждение: Использование этой функции для проверки прав процесса на файл перед выполнением какой-то операции на основе этой информации приводит к состоянию состязательности: права на файл могут измениться между двумя этими шагами. Обычно, безопасней просто попытаться выполнить желаемую операцию и что-то предпринять при возникновении ошибки с правами.

Эта функция всегда разыменовывает символьные ссылки. Если вам нужно проверить права символьной ссылки, используйте вызов faccessat(2) с флагами AT_EACCESS и AT_SYMLINK_NOFOLLOW.

## СМОТРИТЕ ТАКЖЕ
access(2), chmod(2), chown(2), faccessat(2), open(2), setgid(2), setuid(2), stat(2), credentials(7), path_resolution(7)


exec

title: exec(3)

summary: запуск файла на исполнение

text:
# exec(3)

## ИМЯ
execl, execlp, execle, execv, execvp, execvpe - запуск файла на исполнение

## ОБЗОР

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

```
extern char **environ;
```

```
int execl(const char *pathname, const char *arg, ...
/* (char  *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char  *) NULL */);
int execle(const char *pathname, const char *arg, ...
                /*, (char *) NULL, char * const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
                char *const envp[]);
```

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

execvpe(): _GNU_SOURCE

## ОПИСАНИЕ
Семейство функций exec() заменяет текущий образ процесса новым. Описанные в данной справочной странице функции являются оберткой для execve(2) (подробней о см. замене текущего смотрите в справочной странице execve(2)).

Первый аргумент этих функций - имя исполняемого файла.

Функции можно сгруппировать по символам после префикса «exec».

### l - execl(), execlp(), execle()
Параметр const char *arg и последующие параметры можно воспринимать как параметры arg0, arg1, ..., argn. Все вместе они описывают список из одного или нескольких указателей на строки (заканчивающиеся null), который представляет собой список параметров, доступных исполняемой программе. Первый параметр, по соглашению, должен указывать на имя, ассоциированное с файлом, который надо запустить. Список параметров должен заканчиваться указателем null и, так как это функция с переменным числом аргументов, этот указатель должен приводиться к (char *) NULL.

В отличии от функций «l», функции «v» (далее) передают аргументы командной строки исполняемой программе в виде вектора.

### v - execv(), execvp(), execvpe()
Аргумент char *const argv[] — это массив указателей на строки, заканчивающиеся null, которые представляют список аргументов, доступный новой программе. Первый аргумент, по соглашению, должен указать на имя, ассоциированное с файлом, который необходимо запустить. Массив указателей должен заканчиваться указателем null.

### e - execle(), execvpe()
Окружение вызывающего задаётся через аргумент envp. Аргумент envp — это массив указателей на строки с null в конце, который должен заканчиваться указателем null.

Все остальные функции exec() (без «e» в суффиксе) строят окружение нового образа процесса из внешней переменной environ вызывающего процесса.

### p - execlp(), execvp(), execvpe()
Это функции повторяют действия оболочки, относящиеся к поиску исполняемого файла, если указанное имя исполняемого файла не содержит символ черты (/). Путь поиска задаётся в переменной окружения PATH (список каталогов, перечисленных через двоеточие). Если эта переменная не определена, то список по по умолчанию состоит из списка каталогов, возвращаемых confstr(_CS_PATH) (обычно возвращает значение «/bin:/usr/bin») и, возможно, текущего рабочего каталога; подробности смотрите в ЗАМЕЧАНИЯХ.

Если указанное имя файла содержит в себе символ косой черты, переменная PATH будет проигнорирована, и будет запущен файл по указанному пути.

Кроме этого, есть отличия в обработке некоторых ошибок.

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

Если заголовок файла не распознаётся (при попытке выполнения execve(2) возвращает ENOEXEC), то эти функции запускают оболочку (/bin/sh) с полным именем файла в качестве первого параметра (если это тоже приводит к ошибке, то поиск останавливается).

Все остальные функции exec() (без «p» в суффиксе) в качестве первого аргумента используют путь (относительный или абсолютный) к будущей исполняемой программе.

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

## ОШИБКИ
Все функции могут завершиться с ошибкой и присвоить errno значения любых ошибок execve(2).

## ВЕРСИИ
Функция execvpe() впервые появилась в glibc 2.11.

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

Интерфейс

Атрибут

Значение

execl(), execle(), execv()

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

MT-Safe

execlp(), execvp(), execvpe()

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

MT-Safe env

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

Функция execvpe() является расширением GNU.

## ЗАМЕЧАНИЯ
Путь поиска по умолчанию (используемый, если в окружении отсутствует переменная PATH) в разных системах отличается. Обычно, он содержит /bin и /usr/bin (в таком порядке), а также может содержать текущий рабочий каталог. В некоторых системах текущий рабочий каталог добавляется после /bin и /usr/bin, чтобы не запустить подложенную программу «троянского коня». В реализации glibc долгое время придерживались традиции, где текущий рабочий каталог включался в начало пути поиска. Однако, в результате переработки кода при разработке glibc 2.24 в путь поиска по умолчанию текущий рабочий каталог больше не стали добавлять совсем. Такое несущественное изменение посчитали преимуществом и не стали возвращать всё назад.

Поведение функций execlp() и execvp() при ошибках во время попыток исполнения файла сложилось исторически, но при этом оно не описано и не определено в стандарте POSIX. В BSD (и, возможно, других системах) выполняется автоматическое ожидание и повтор, если возникает ошибка ETXTBSY. В Linux это воспринимается как невосстановимая ошибка, и она сразу возвращается.

Традиционно, функции execlp() и execvp() игнорировали все ошибки за исключением описанных выше, а также ENOMEM и E2BIG, которые они возвращают. В Linux эти функции возвращают любую ошибку, помимо перечисленных ранее.

## ДЕФЕКТЫ
До glibc 2.24, execl() и execle() использовали realloc(3) и поэтому были не безопасны для асинхронных сигналов, что нарушало требования POSIX.1. Это было исправлено в glibc 2.24.

### Специфика некоторых архитектур
Для совместимости с SunOS на sparc и sparc64, execv() предоставляется как системный вызов ядра (с прототипом, показанным выше). Он не применяется в обёрточной функции execv() на этих архитектурах.

## СМОТРИТЕ ТАКЖЕ
sh(1), execve(2), execveat(2), fork(2), ptrace(2), fexecve(3), system(3), environ(7)


exit

title: exit(3)

summary: вызывает нормальное завершение процесса

text:
# exit(3)

## ИМЯ
exit - вызывает нормальное завершение процесса

## ОБЗОР

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

```
void exit(int status);
```

## ОПИСАНИЕ
Функция exit() выполняет нормальное завершение процесса и возвращает значение status & 0377 породившему процессу (смотрите wait(2)).

Вызываются все функции, зарегистрированные с помощью atexit(3) и on_exit(3), в обратном по отношению к регистрации порядке (в этих функциях возможно использовать atexit(3) или on_exit(3) для регистрации дополнительной функции, которая будет также вызвана при выходе; при этом она добавляется в начало списка функций, которые осталось вызвать). Если из одной из функций не происходит возврат (например, она вызывает _exit(2) или завершает себя по сигналу), то оставшиеся функции не вызываются, и дальнейший процесс выхода прекращается (в частности, запись потоков stdio(3)). Если функция зарегистрирована с помощью atexit(3) или on_exit(3) несколько раз, то она вызывается столько раз, сколько зарегистрирована.

Все открытые потоки stdio(3) записываются и закрываются. Файлы, созданные tmpfile(3), удаляются.

В стандарте Си определены две константы, EXIT_SUCCESS и EXIT_FAILURE, которые можно передавать exit() для указания корректности или некорректности завершения, соответственно.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция exit() не возвращает выполнение.

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

Интерфейс

Атрибут

Значение

exit()

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

MT-Unsafe race:exit

Функция exit() использует глобальную незащищённую переменную, поэтому функцию нельзя использовать в нескольких нитях одновременно.

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

## ЗАМЕЧАНИЯ
Поведение не определено, если одна из функций, зарегистрированных с помощью atexit(3) и on_exit(3), вызовет exit() или longjmp(3). Заметим, что вызов execve(2) удаляет регистрацию функций, сделанную с помощью atexit(3) и on_exit(3).

Использование EXIT_SUCCESS и EXIT_FAILURE является более переносимым методом (в не-UNIX окружения), чем указание 0 и какого-то ненулевого значения (например, 1 или -1). В частности, в VMS используется другое соглашение.

В BSD пытались стандартизовать коды завершения (которые также были взяты и другие библиотеки Си, например GNU C); смотрите файл <sysexits.h>.

После exit() код выхода должен быть передан родительскому процессу. Есть три варианта:

- Если родитель установил обработчик SA_NOCLDWAIT или SIGCHLD равным SIG_IGN, то код выхода отбрасывается и потомок завершается сразу.

- Если родитель ожидает завершения потомка, то он получает код выхода и потомок сразу завершается.

- Иначе потомок становится процессом «зомби»: большинство ресурсов процесс задействуется вторично, но слот с минимумом информации о процессе-потомке (код завершения, статистика по использованию ресурсов) остаётся в таблице процессов. Это позволяет родителю в дальнейшем использовать waitpid(2) (или подобный) для получения кода завершения потомка; после этого слот под процесс-зомби освобождается.

Если в реализации поддерживается сигнал SIGCHLD, то он посылается родителю. Если родитель установил флаг SA_NOCLDWAIT, то поведение при сигнале SIGCHLD не определено.

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

Если завершение процесса приводит к осиротению группы процессов, и если любой член только что осиротевшей группы останавливается, то каждому процессу этой группы после сигнала SIGHUP будет послан сигнал SIGCONT. Описание процесса осиротения группы смотрите в setpgid(2).

За исключением описанные выше случаев, когда процессы, куда посылается сигнал, могут быть потомками завершающегося процесса, завершение процесса, обычно, не приводит к отправке сигнала потомкам этого процесса. Однако, процесс может вызвать prctl(2) с операцией PR_SET_PDEATHSIG, чтобы подготовиться к получению сигнала, если его родитель завершает работу.

## СМОТРИТЕ ТАКЖЕ
_exit(2), get_robust_list(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)


exp

title: exp(3)

summary: функция вычисления экспоненты

text:
# exp(3)

## ИМЯ
exp, expf, expl - функция вычисления экспоненты

## ОБЗОР

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

```
double exp(double x);
float expf(float x);
long double expl(long double x);
```

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

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

expf(), expl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции возвращают значение e (основание натурального логарифма), возведённое в степень x.

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

Если x имеет значение NaN, будет возвращено NaN.

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

Если x равно минус бесконечности, возвращается +0.

Если в результате исчерпана степень числа, то возникает ошибка диапазона и возвращается ноль.

Если в результате превышена разрядность, то возникает ошибка диапазона и функции возвращают +HUGE_VAL, +HUGE_VALF или +HUGE_VALL, соответственно.

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Могут возникать следующие ошибки:

Ошибка диапазона, переполнение

Значение errno устанавливается в ERANGE. Возникает исключение переполнения плавающей точки (FE_OVERFLOW).

Ошибка диапазона, исчерпана степень

Значение errno устанавливается в ERANGE. Возникает исключение исчерпания степени плавающей точки (FE_UNDERFLOW).

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

Интерфейс

Атрибут

Значение

exp(), expf(), expl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
cbrt(3), cexp(3), exp10(3), exp2(3), expm1(3), sqrt(3)


title: exp10(3)

summary: функция степени по основанию 10

text:
# exp10(3)

## ИМЯ
exp10, exp10f, exp10l - функция степени по основанию 10

## ОБЗОР

```
#define _GNU_SOURCE         /* смотрите feature_test_macros(7) */
#include <math.h>
```

```
double exp10(double x);
float exp10f(float x);
long double exp10l(long double x);
```

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

## ОПИСАНИЕ
Данные функции возвращают значение 10, возведённое в степень x.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешной работе эти функции возвращают 10 в степени x.

Описание работы со специальными значениями, такими как бесконечность и NaN, а также при превышении и исчерпании степени смотрите в exp(3).

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Обсуждение возникающих ошибок этих функций смотрите в exp(3).

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

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

Интерфейс

Атрибут

Значение

exp10(), exp10f(), exp10l()

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

MT-Safe

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

## ДЕФЕКТЫ
До версии 2.19 в реализации glibc при возникновении ошибки исчерпания степени errno не устанавливалось в значение ERANGE.

## СМОТРИТЕ ТАКЖЕ
cbrt(3), exp(3), exp2(3), log10(3), sqrt(3)


title: exp2(3)

summary: функция степени по основанию 2

text:
# exp2(3)

## ИМЯ
exp2, exp2f, exp2l - функция степени по основанию 2

## ОБЗОР

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

```
double exp2(double x);
float exp2f(float x);
long double exp2l(long double x);
```

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

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

exp2(), exp2f(), exp2l():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Данные функции возвращают значение 2, возведённое в степень x.

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

Описание работы со специальными значениями, такими как бесконечность и NaN, а также при превышении и исчерпании степени смотрите в exp(3).

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Обсуждение возникающих ошибок этих функций смотрите в exp(3).

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

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

Интерфейс

Атрибут

Значение

exp2(), exp2f(), exp2l()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
cbrt(3), cexp2(3), exp(3), exp10(3), sqrt(3)


title: expm1(3)

summary: экспоненциальный минус 1

text:
# expm1(3)

## ИМЯ
expm1, expm1f, expm1l - экспоненциальный минус 1

## ОБЗОР

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

```
double expm1(double x);
float expm1f(float x);
long double expm1l(long double x);
```

```

```

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

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

expm1():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

expm1f(), expm1l(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Данные функции возвращают значение эквивалентное

```
    exp(x) - 1
```

Результат вычисляется методом, выдающим точные значения, даже если значение x близко к нулю — случай, где exp(x) - 1 было бы неточно из-за вычитания практически одинаковых чисел.

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

Если x имеет значение NaN, будет возвращено NaN.

Если x равно +0 (-0), будет возвращено +0 (-0).

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

Если x равно минус бесконечности, возвращается -1.

Если в результате превышена разрядность, то возникает ошибка диапазона и функции возвращают -HUGE_VAL, -HUGE_VALF или -HUGE_VALL, соответственно.

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Могут возникать следующие ошибки:

Ошибка диапазона, переполнение

Значение errno устанавливается в ERANGE (но см. ДЕФЕКТЫ). Возникает исключение переполнения плавающей точки (FE_OVERFLOW).

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

Интерфейс

Атрибут

Значение

expm1(), expm1f(), expm1l()

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

MT-Safe

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

## ДЕФЕКТЫ
Для некоторых огромных отрицательных значений x (где возвращаемое значение функции близко к -1), expm1() приводит к некорректному исключению исчерпания чисел с плавающей запятой.

Для некоторых огромных положительных значений x кроме ожидаемого исключения переполнения возникает некорректное исключение плавающей точки и возвращается NaN вместо плюс бесконечности.

До версии 2.11 в реализации glibc при возникновении ошибки диапазона errno не устанавливалось в значение ERANGE.

## СМОТРИТЕ ТАКЖЕ
exp(3), log(3), log1p(3)


fabs

title: fabs(3)

text:
# fabs(3)

## ИМЯ
fabs, fabsf, fabsl - вычисление абсолютного значения числа с плавающей точкой

## ОБЗОР

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

```
double fabs(double x);
float fabsf(float x);
long double fabsl(long double x);
```

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

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

fabsf(), fabsl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции возвращают абсолютное значение числа с плавающей точкой x.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают абсолютное значение x.

Если x имеет значение NaN, будет возвращено NaN.

Если x стремится к -0, будет возвращено +0.

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

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

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

Интерфейс

Атрибут

Значение

fabs(), fabsf(), fabsl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
abs(3), cabs(3), ceil(3), floor(3), labs(3), rint(3)


fclose

title: fclose(3)

summary: закрывает поток

text:
# fclose(3)

## ИМЯ
fclose - закрывает поток

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

int fclose(FILE *stream);

## ОПИСАНИЕ
Функция fclose() сбрасывает (flushes) поток, указанный в stream (записывает все буферизированные выходные данные с помощью fflush(3)) и закрывает связанный с ним файловый дескриптор.

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

## ОШИБКИ
EBADF

В stream указан неверный дескриптор файла.

Функция fclose() при ошибках может установить errno в значение, соответствующее ошибкам функций close(2), write(2) или fflush(3).

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

Интерфейс

Атрибут

Значение

fclose()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Заметим, что fclose() сбрасывает буферы только пользовательского пространства, заданные библиотекой Си. Чтобы гарантировать, что данные действительно физически сохранены на диске, буферы ядра также должны быть сохранены, например, с помощью вызова sync(2) или fsync(2).

## СМОТРИТЕ ТАКЖЕ
close(2), fcloseall(3), fflush(3), fileno(3), fopen(3), setbuf(3)


fcloseall

title: fcloseall(3)

summary: закрытие всех открытых потоков

text:
# fcloseall(3)

## ИМЯ
fcloseall - закрытие всех открытых потоков

## ОБЗОР

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

```
int fcloseall(void);
```

## ОПИСАНИЕ
Функция fcloseall() закрывает все открытые потоки вызвавшего процесса. Перед закрытием буферизированный вывод каждого потока записывается (как с fflush(3)), а буферизированный ввод отбрасывается.

Стандартные потоки, stdin, stdout и stderr, также закрываются.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данная функция возвращает 0, если все файлы успешно закрыты, и EOF в случае ошибки.

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

Интерфейс

Атрибут

Значение

fcloseall()

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

MT-Unsafe race:streams

Функция fcloseall() не блокирует потоки, поэтому её нельзя использовать в нескольких нитях одновременно.

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

## СМОТРИТЕ ТАКЖЕ
close(2), fclose(3), fflush(3), fopen(3), setbuf(3)


fdim

title: fdim(3)

summary: вычисление положительной разницы

text:
# fdim(3)

## ИМЯ
fdim, fdimf, fdiml - вычисление положительной разницы

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

double fdim(double x, double y);

float fdimf(float x, float y);

long double fdiml(long double x, long double y);

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

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

fdimf(), fdiml():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Эти функции возвращают положительную разницу, max(x-y,0), между их аргументами.

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

Если x или y равно NaN, то будет возвращено NaN.

Если в результате превышена разрядность, то возникает ошибка диапазона и функции возвращают HUGE_VAL, HUGE_VALF или HUGE_VALL, соответственно.

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Могут возникать следующие ошибки:

Ошибка диапазона: результат превысил разрядность

Вызывается исключение переполнения плавающей точки (FE_OVERFLOW).

Эти функции не изменяют errno.

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

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

Интерфейс

Атрибут

Значение

fdim(), fdimf(), fdiml()

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

MT-Safe

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

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


fenv

title: fenv(3)

summary: округление и

text:
# fenv(3)

## ИМЯ
feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept - округление и обработка ошибок для чисел с плавающей запятой

## ОБЗОР

```
#include <fenv.h>
```

```
int feclearexcept(int excepts);
int fegetexceptflag(fexcept_t *flagp, int excepts);
int feraiseexcept(int excepts);
int fesetexceptflag(const fexcept_t *flagp, int excepts);
int fetestexcept(int excepts);
```

```
int fegetround(void);
int fesetround(int rounding_mode);
```

```
int fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *envp);
int fesetenv(const fenv_t *envp);
int feupdateenv(const fenv_t *envp);
```

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

## ОПИСАНИЕ
Эти одиннадцать функций определены в C99, и описывают обработку округления и исключения (переполнение, деление на ноль и т. д.) при работе с числами с плавающей запятой.

### Исключения
Исключение деление-на-ноль (divide-by-zero) возникает, когда результатом операции над конечными числами является бесконечность.

Исключение переполнение (overflow) возникает, когда результат возможно представить в виде числа с плавающей запятой, но он намного больше абсолютного значения самого большого (конечного) представимого числа с плавающей запятой.

Исключение исчерпания(underflow) возникает, когда результат можно представить в виде числа с плавающей запятой, но он меньше абсолютного значения самого малого положительного нормализованного числа с плавающей запятой (и возникает большая потеря точности, если представить его в виде денормализованного числа).

Исключение inexact возникает, когда округлённый результат операции не равен бесконечной точности результата. Оно может произойти при исключении переполнении или исчерпании.

Исключение invalid возникает, когда при операции получается плохо определённый результат (no well-defined result), например, при 0/0 или бесконечность - бесконечность или sqrt(-1).

### Обработка исключений
Исключения представляются двумя способами: в виде одного бита (наличие/отсутствие исключения) и целого числа, где каждый бит соответствует исключению (определяется реализацией), а также структуры скрытого формата, которая может содержать дополнительную информацию об исключении (возможно, адрес в коде, где оно возникло).

Если реализацией поддерживается обработка определённого исключения, то определён соответствующий макрос: FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW. Если таким способом определить соответствующий бит(ы), например, с целочисленным аргументом FE_OVERFLOW|FE_UNDERFLOW, то могут вызываться функции обработки исключений. Могут поддерживаться и другие исключения. Макрос FE_ALL_EXCEPT — это побитовый OR всех бит, соответствующих поддерживаемым исключениям.

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

Функция fegetexceptflag() сохраняет представление состояния флагов исключения, представленного аргументом excepts в чёрном ящике *flagp.

Функция feraiseexcept() возбуждает поддерживаемые исключения, заданные битами в excepts.

Функция fesetexceptflag() задаёт полное состояние для исключений, представленных в excepts, в значение *flagp. Это значение должно быть получено с помощью вызова fegetexceptflag() с последним аргументом, значение которого содержит все биты в excepts.

Функция fetestexcept() возвращает слово, в котором биты устанавливаются в соответствии с установленными битами в аргументе excepts и для которых установлено соответствующее исключение.

### Режим округления
Режим округления определяет трактовку результата операций с плавающей запятой, если результат не может быть точно представлен в значащей части числа(significand). Могут быть доступны различные режимы округления: округление к ближайшему (по умолчанию), округление в сторону увеличения (round up, к положительной бесконечности), округление в сторону уменьшения (round down, к отрицательной бесконечности) и округление в сторону нуля.

Если в реализации поддерживается получение и установка направления округления, то для них определены соответствующие макросы: FE_TONEAREST, FE_UPWARD, FE_DOWNWARD и FE_TOWARDZERO.

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

Функция fesetround() задаёт режим округления в соответствии со значением аргумента и возвращает ноль при успешном выполнении.

В C99 и POSIX.1-2008 в файле <float.h> описан идентификатор FLT_ROUNDS, который определяет используемый реализацией режим поведения для сложения чисел с плавающей запятой. Значениями идентификатора могут быть:

-1

Режим округления не определён.

0

Округление к нулю.

1

Округление к ближайшему числу.

2

Округление в сторону положительной бесконечности.

3

Округление в сторону отрицательной бесконечности.

Существуют другие значения для нестандартных режимов округления, зависящие от архитектуры.

Значение FLT_ROUNDS должно отражать текущий режим округления, который задаётся с помощью fesetround() (но смотрите ДЕФЕКТЫ).

### Окружение плавающей запятой
С полным окружением плавающей запятой, включая режимы управления и флаги состояния, можно работать через скрытый объект с типом fenv_t. Окружение по умолчанию обозначается как FE_DFL_ENV (с типом const fenv_t *). Это окружение задаётся при запуске программы и определено в ISO C; в нём включено округление к ближайшему числу, все исключения сброшены и задан безостановочный режим (продолжать при возникновении исключений).

Функция fegetenv() сохраняет текущее окружение плавающей запятой в объект *envp.

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

Функция fesetenv() восстанавливает окружение плавающей запятой из объекта *envp. Данный объект должен быть корректен, например, должен быть получен из вызова fegetenv() или feholdexcept() или равен FE_DFL_ENV. Данный вызов не возбуждает исключения.

Функция feupdateenv() устанавливает окружение плавающей запятой, представленное объектом *envp, за исключением того, что уже возбуждённые исключения не очищаются. После вызова этой функции, возбуждённые исключения будут побитово сложены с установленными ранее в *envp. Как и для предыдущей функции, объект *envp должен быть корректен.

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

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

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

Интерфейс

Атрибут

Значение

feclearexcept(), fegetexceptflag(), feraiseexcept(), fesetexceptflag(), fetestexcept(), fegetround(), fesetround(), fegetenv(), feholdexcept(), fesetenv(), feupdateenv(), feenableexcept(), fedisableexcept(), fegetexcept()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
IEC 60559 (IEC 559:1989), ANSI/IEEE 854, C99, POSIX.1-2001.

## ЗАМЕЧАНИЯ

### Замечания по glibc
Если возможно, библиотека GNU C определяет макрос FE_NOMASK_ENV, представляющий окружение, в котором при каждом возбуждении исключения срабатывает ловушка (trap). Вы можете проверить этот макрос с помощью #ifdef. Он определён, только при определении _GNU_SOURCE. В стандарте C99 нет способа установить отдельные биты в маске плавающей запятой, например, чтобы отловить определённые флаги. Начиная с версии 2.2, в glibc поддерживаются функции feenableexcept() и fedisableexcept(), которые устанавливают отдельные ловушки плавающей запятой, и fegetexcept() для получения состояния.

```
#define _GNU_SOURCE         /* смотрите feature_test_macros(7) */
#include <fenv.h>
```

```
int feenableexcept(int excepts);
int fedisableexcept(int excepts);
int fegetexcept(void);
```

Функции feenableexcept() и fedisableexcept() включают (отключают) ловушки для каждого исключения, представленного в excepts, и при успешном выполнении возвращают старый набор включённых исключений, и -1 в противном случае. Функция fegetexcept() возвращает набор всех включённых в данных момент исключений.

## ДЕФЕКТЫ
В C99 указано, что значение FLT_ROUNDS должно отражать изменения текущего режима округления, устанавливаемого с помощью fesetround(). В настоящее время это не выполняется: значение FLT_ROUNDS всегда равно 1.

## СМОТРИТЕ ТАКЖЕ
math_error(7)


ferror

title: ferror(3)

summary: проверка и сброс состояния потока

text:
# ferror(3)

## ИМЯ
clearerr, feof, ferror, fileno - проверка и сброс состояния потока

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

void clearerr(FILE *stream);

int feof(FILE *stream);

int ferror(FILE *stream);

int fileno(FILE *stream);

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

fileno(): _POSIX_C_SOURCE

## ОПИСАНИЕ
Функция clearerr() очищает индикаторы конца файла и ошибки потока, указанного в stream.

Функция feof() проверяет индикатор конца файла для потока, указанного в stream, возвращая при этом ненулевое значение, если индикатор установлен. Индикатор конца файла может быть очищен только функцией clearerr().

Функция ferror() проверяет индикатор ошибки для потока, указанного в stream, возвращая при этом ненулевое значение, если индикатор установлен. Индикатор ошибки может быть очищен только функцией clearerr().

Функция fileno() исследует параметр stream и возвращает целочисленный файловый дескриптор, который используется для реализации этого потока. Файловый дескриптор продолжает принадлежать stream и будет закрыт при вызове fclose(3). Сделайте копию файлового дескриптора с помощью dup(2) перед передачей его коду, который может его закрыть.

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

## ОШИБКИ
Данные функции не должны завершаться с ошибкой и поэтому не устанавливают значение внешней переменной errno (тем не менее, в случае с fileno(), если аргумент не является корректным потоком, возвращается -1 и errno приравнивается значение EBADF).

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

Интерфейс

Атрибут

Значение

clearerr(), feof(), ferror(), fileno()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции clearerr(), feof() и ferror() соответствует стандартам C89, C99, POSIX.1-2001 и POSIX.1-2008.

Функция fileno() соответствует POSIX.1-2001 и POSIX.1-2008.

## СМОТРИТЕ ТАКЖЕ
open(2), fdopen(3), stdio(3), unlocked_stdio(3)


fexecve

title: fexecve(3)

text:
# fexecve(3)

## ИМЯ
fexecve - запускает программу, заданную файловым дескриптором

## ОБЗОР

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

```
int fexecve(int fd, char *const argv[], char *const envp[]);
```

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

fexecve():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

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

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

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

EINVAL

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

ENOENT

На fd установлен флаг close-on-exec и fd ссылается на сценарий. Смотрите ДЕФЕКТЫ.

ENOSYS

Ядро не предоставляет системный вызов execveat(2) и файловая система /proc недоступна.

## ВЕРСИИ
Функция fexecve() появилась в glibc 2.3.2.

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

Интерфейс

Атрибут

Значение

fexecve()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008. Эта функция не определена в POSIX.1-2001 и широко не распространена среди других систем. Она определена в POSIX.1-2008.

## ЗАМЕЧАНИЯ
В Linux c glibc с версией 2.26 и старее функция fexecve() реализована с использованием файловой системы proc(5), поэтому /proc должна быть смонтирована и доступна на момент вызова. Начиная с glibc 2.27, если используемое ядро поддерживает системный вызов execveat(2), то fexecve() реализуется через этот системный вызов и /proc монтировать уже не нужно.

Предназначение fexecve() — позволить вызывающему проверить содержимое исполняемого файла (контрольную сумму) до запуска. Простого открытия файла, вычисления контрольной суммы содержимого и выполнения execve(2) недостаточно, так как между двумя этими шагами может измениться имя файла или каталог пути (например, посредством изменения цели символьной ссылки). Функция fexecve() не решает проблему возможного изменения содержимого файла между проверкой контрольной суммы и вызовом fexecve() — для этого есть права на файл, которые должны предотвращать его несанкционированное изменение.

Естественная идиома при использовании fexecve() — установить флаг закрытия-при-выполнении на fd для того, чтобы дескриптор файла не утекал выполняемой программе. Этот подход естественен по двум причинам. Во-первых, это предотвращает трату дескрипторов файлов без надобности (выполняемой программе, обычно, не нужен дескриптор файла, который ссылается на саму программу). Во-вторых, если fexecve() использовать рекурсивно, то применение флага закрытия-при-выполнении предотвращает исчерпание дескрипторов файлов, которое произошло бы, так как каждый шаг в рекурсии вызывает передачу ещё одного дескриптора файла новой программе (но смотрите ДЕФЕКТЫ).

## ДЕФЕКТЫ
Если fd ссылается на сценарий (т. е., это исполняемый текстовый файл, у которого в первой строке (начинается с #!) указан интерпретатор сценария и флаг закрытия-при-выполнении установлен на fd, то fexecve() завершается с ошибкой ENOENT. Эта ошибка возникает потому, что на момент выполнения интерпретатора сценария fd уже закрыт, так как указан флаг закрытия-при-выполнении. Таким образом флаг закрытия-при-выполнении не может быть установлен fd, если он указывает на сценарий, так как это приводит к проблемам, описанным в ЗАМЕЧАНИЯХ.

## СМОТРИТЕ ТАКЖЕ
execve(2), execveat(2)


fflush

title: fflush(3)

summary: сбрасывает поток

text:
# fflush(3)

## ИМЯ
fflush - сбрасывает поток

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

int fflush(FILE *stream);

## ОПИСАНИЕ
Для потоков вывода функция fflush() принудительно записывает все буферизированные в пользовательском пространстве данные в устройство вывода данных или корректирует stream посредством определённой для него функции записи.

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

При этом поток остается открытым.

Если аргумент stream равен NULL, то fflush() сбрасывает данные всех открытых потоков вывода.

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

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

## ОШИБКИ
EBADF

Поток stream не открыт или не открыт для записи.

Функция fflush() может завершиться с ошибкой и присвоить errno любое значение из определённых для write(2).

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

Интерфейс

Атрибут

Значение

fflush()

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

MT-Safe

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

В POSIX.1-2001 не определено поведение для сброса потоков ввода, но но это описано в POSIX.1-2008.

## ЗАМЕЧАНИЯ
Заметим, что fflush() сбрасывает буферы только пользовательского пространства, заданные библиотекой Си. Чтобы гарантировать, что данные действительно физически сохранены на диске, буферы ядра также должны быть сохранены, например, с помощью вызова sync(2) или fsync(2).

## СМОТРИТЕ ТАКЖЕ
fsync(2), sync(2), write(2), fclose(3), fileno(3), fopen(3), setbuf(3), unlocked_stdio(3)


ffs

title: ffs(3)

summary: ищет первый установленный бит в слове

text:
# ffs(3)

## ИМЯ
ffs, ffsl, ffsll - ищет первый установленный бит в слове

## ОБЗОР

```
#include <strings.h>
```

```
int ffs(int i);
```

```
#include <string.h>
```

```
int ffsl(long int i);
```

```
int ffsll(long long int i);
```

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

ffs():

Начиная с glibc 2.12:

_XOPEN_SOURCE >= 700

|| ! (_POSIX_C_SOURCE >= 200809L)

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

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

До glibc 2.12:

ни одного

ffsl(), ffsll():

Начиная с glibc 2.27:

_DEFAULT_SOURCE

До glibc 2.27:

_GNU_SOURCE

## ОПИСАНИЕ
Функция ffs() возвращает позицию первого (считая с наименее значимого) установленного бита в слове i. Наименее значимый бит находится в позиции номер 1, а наиболее значимый — в позиции (как пример) номер 32 или 64. Функции ffsll() и ffsl() делают то же самое, но имеют аргументы возможно других размеров.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Эти функции возвращают положение первого установленного бита или 0, если в i не установлено ни одного бита.

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

Интерфейс

Атрибут

Значение

ffs(), ffsl(), ffsll()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
ffs(): POSIX.1-2001, POSIX.1-2008, 4.3BSD.

Функции ffsl() и ffsll() являются расширениями glibc.

## ЗАМЕЧАНИЯ
В системах BSD прототип указан в <string.h>.

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


fgetc

title: fgetc(3)

summary: функции для ввода символов и строк

text:
# fgetc(3)

## ИМЯ
fgetc, fgets, getc, getchar, ungetc - функции для ввода символов и строк

## ОБЗОР

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

```
int fgetc(FILE *stream);
```

```
char *fgets(char *s, int size, FILE *stream);
```

```
int getc(FILE *stream);
```

```
int getchar(void);
```

```
int ungetc(int c, FILE *stream);
```

## ОПИСАНИЕ
Функция fgetc() считывает очередной символ из потока stream и возвращает unsigned char преобразованный в int, или EOF при достижении конца файла или при возникновении ошибки.

Функция getc() похожа на fgetc(), но она может быть реализована как макрос, который определяет состояние stream более одного раза.

Функция getchar() эквивалентна getc(stdin).

Функция fgets() считывает максимум size -1 символов из stream и записывает их в буфер, на который указывает s. Чтение прерывается по достижении EOF или символа новой строки. Если получен символ новой строки, то он заносится в буфер. В конец буфера после последнего символа добавляется завершающий байт null ('\0').

Функция ungetc() заносит c обратно в stream, преобразует в unsigned char, если это возможно для дальнейших операций чтения. Занесённые обратно символы будут возвращаться в обратном порядке; гарантируется только одно занесение символов.

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

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции fgetc(), getc() и getchar() возвращают символ, считанный как unsigned char и преобразованный в int, или EOF по достижении конца файла или при возникновении ошибки.

Функция fgets() возвращает s при удачном выполнении и NULL при ошибке или если достигнут конец файла, а символы остались несчитанными.

При успешном выполнении функция ungetc() возвращает c или EOF при ошибке.

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

Интерфейс

Атрибут

Значение

fgetc(), fgets(), getc(), getchar(), ungetc()

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

MT-Safe

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

Не рекомендуется чередовать вызовы функций ввода библиотеки stdio с низкоуровневыми вызовами read(2) для дескриптора файла, связанного с потоком ввода; результат этого будет неопределённым и, скорее всего, не тем, который ожидается.

## СМОТРИТЕ ТАКЖЕ
read(2), write(2), ferror(3), fgetwc(3), fgetws(3), fopen(3), fread(3), fseek(3), getline(3), gets(3), getwchar(3), puts(3), scanf(3), ungetwc(3), unlocked_stdio(3), feature_test_macros(7)


fgetgrent

title: fgetgrent(3)

summary: возвращает запись из файла групп

text:
# fgetgrent(3)

## ИМЯ
fgetgrent - возвращает запись из файла групп

## ОБЗОР

```
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
```

```
struct group *fgetgrent(FILE *stream);
```

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

fgetgrent():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_SVID_SOURCE

## ОПИСАНИЕ
Функция fgetgrent() возвращает указатель на структуру, содержащую информацию о группах из файла, на который ссылается stream. Во время первого вызова функция возвращает первую запись; в дальнейшем она возвращает все последующие записи. Формат файла, на который указывает stream, должен быть таким же как у /etc/group (смотрите group(5)).

Структура group определена в <grp.h> следующим образом:

```
struct group {

    char   *gr_name;        /* имя группы */

    char   *gr_passwd;      /* пароль группы */

    gid_t   gr_gid;         /* ID группы */

    char  **gr_mem;         /* массив, указателей

                               имён членов группы, оканчивающийся NULL */
};
```

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция fgetgrent() возвращает указатель на структуру group или NULL, если больше записей не найдено или произошла ошибка. При ошибке errno присваивается соответствующее значение.

## ОШИБКИ
ENOMEM

Недостаточно памяти для структуры group.

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

Интерфейс

Атрибут

Значение

fgetgrent()

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

MT-Unsafe race:fgetgrent

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

## СМОТРИТЕ ТАКЖЕ
endgrent(3), fgetgrent_r(3), fopen(3), getgrent(3), getgrgid(3), getgrnam(3), putgrent(3), setgrent(3), group(5)


fgetpwent

title: fgetpwent(3)

summary: получает записи из файла паролей

text:
# fgetpwent(3)

## ИМЯ
fgetpwent - получает записи из файла паролей

## ОБЗОР

```
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
```

```
struct passwd *fgetpwent(FILE *stream);
```

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

fgetpwent():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_SVID_SOURCE

## ОПИСАНИЕ
Функция fgetpwent() возвращает указатель на структуру, содержащую отдельные поля строки файла stream. Во время первого вызова функция возвращает первую запись; в дальнейшем она возвращает все последующие записи. Формат файла stream должен быть таким же как у /etc/passwd (смотрите passwd(5)).

Структура passwd определена в <pwd.h> таким образом:

```
struct passwd {

    char   *pw_name;       /* имя пользователя */

    char   *pw_passwd;     /* пароль пользователя */

    uid_t   pw_uid;        /* идентификатор пользователя */

    gid_t   pw_gid;        /* идентификатор группы */

    char   *pw_gecos;      /* настоящее имя */

    char   *pw_dir;        /* домашний каталог */

    char   *pw_shell;      /* программная оболочка */
};
```

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция fgetpwent() возвращает указатель на структуру passwd или NULL, если больше паролей не найдено или произошла ошибка. При ошибке errno присваивается соответствующее значение.

## ОШИБКИ
ENOMEM

Недостаточно памяти для структуры passwd.

## ФАЙЛЫ
/etc/passwd

файл, содержащий базу паролей

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

Интерфейс

Атрибут

Значение

fgetpwent()

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

MT-Unsafe race:fgetpwent

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

## СМОТРИТЕ ТАКЖЕ
endpwent(3), fgetpwent_r(3), fopen(3), getpw(3), getpwent(3), getpwnam(3), getpwuid(3), putpwent(3), setpwent(3), passwd(5)


fgetwc

title: fgetwc(3)

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

text:
# fgetwc(3)

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

## ОБЗОР

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

```
wint_t fgetwc(FILE *stream);
wint_t getwc(FILE *stream);
```

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

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

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

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

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

EILSEQ

Данные, полученные из входного потока, не содержат корректного символа.

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

Интерфейс

Атрибут

Значение

fgetwc(), getwc()

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

MT-Safe

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

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

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

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


fgetws

title: fgetws(3)

text:
# fgetws(3)

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

## ОБЗОР

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

```
wchar_t *fgetws(wchar_t *ws, int n, FILE *stream);
```

## ОПИСАНИЕ
Функция fgetws() — это эквивалент fgets(3), но работающий со строками широких символов. Она читает строку из не более чем n-1 широких символов, записывает её в массив широких символов ws и добавляет завершающий широкий символ null (L'\0'). Она прекращает чтение после обнаружения и записи широкого символа новой строки. Это также происходит и в случае достижения конца потока.

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

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

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

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

Интерфейс

Атрибут

Значение

fgetws()

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

MT-Safe

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

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

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

Данная функция ненадёжна, так как не позволяет правильно обработать ситуацию, когда во входных данных появляется широкий символ null.

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


finite

title: finite(3)

text:
# finite(3)

## ИМЯ
finite, finitef, finitel, isinf, isinff, isinfl, isnan, isnanf, isnanl - функции BSD для классификации чисел с плавающей запятой

## ОБЗОР

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

```
int finite(double x);
int finitef(float x);
int finitel(long double x);
```

```
int isinf(double x);
int isinff(float x);
int isinfl(long double x);
```

```
int isnan(double x);
int isnanf(float x);
int isnanl(long double x);
```

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

finite(), finitef(), finitel():

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

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

isinf(): _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE

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

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

isinff(), isinfl(): /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

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

isnan(): _XOPEN_SOURCE || _ISOC99_SOURCE

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

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

isnanf(), isnanl(): _XOPEN_SOURCE >= 600

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

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

## ОПИСАНИЕ
Функции finite(), finitef() и finitel() возвращают ненулевое значение, если x не равно бесконечности или «не числу» (NaN), в противном случае 0.

Функции isnan(), isnanf() и isnanl() возвращают ненулевое значение, если x равно NaN, в противном случае 0.

Функции isinf(), isinff() и isinfl() возвращают 1, если x равно плюс бесконечности, -1, если x равно минус бесконечности, в остальных случаях 0.

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

Интерфейс

Атрибут

Значение

finite(), finitef(), finitel(), isinf(), isinff(), isinfl(), isnan(), isnanf(), isnanl()

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

MT-Safe

## ЗАМЕЧАНИЯ
Заметим, что эти функции устарели. В C99 их заменили макросы isfinite(), isinf() и isnan() (для всех типов). Также заметим, что для isinf() C99 не гарантируется возвращаемого значения. Смотрите fpclassify(3).

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


flockfile

title: flockfile(3)

summary: блокирует FILE для stdio

text:
# flockfile(3)

## ИМЯ
flockfile, ftrylockfile, funlockfile - блокирует FILE для stdio

## ОБЗОР

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

```
void flockfile(FILE *filehandle);
int ftrylockfile(FILE *filehandle);
void funlockfile(FILE *filehandle);
```

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

Для всех функций, перечисленных выше:

/* начиная с glibc 2.24: */ _POSIX_C_SOURCE >= 199309L

|| /* Glibc versions <= 2.23: */ _POSIX_C_SOURCE

|| /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функции stdio можно без опаски использовать в нитях. Это достигается назначением каждому объекту FILE счётчика блокировок и (если счётчик не равен нулю) нити-владельца. При каждом библиотечном вызове эти функции ждут разблокировки объекта FILE другой нитью, блокируют его, а затем выполняют заданную операцию ввода/вывода и разблокируют объект.

(Замечание: блокировка не учитывается, если блокировка файла осуществлялась функциями типа flock(2) и lockf(3).)

Всё это прозрачно и незаметно для программиста на С, но всё же есть две причины для более подробного изучения. Первая: возможны последовательности операций ввода/вывода в одной нити, при этом другая нить не будет прерывать ввод/вывод. Вторая: можно избежать чрезмерной нагрузки от блокировок.

С этой целью нить может явно блокировать объект FILE, осуществить серию операций ввода/вывода, а затем снять блокировку. При этом другие нити не могут вклиниться между операциями. Если причиной для реализации всего этого является повышение эффективности работы, то для ввода/вывод можно использовать неблокирующие версии функций stdio: getc_unlocked(3) и putc_unlocked(3) вместо getc(3) и putc(3).

Функция flockfile() ожидает, пока *filehandle не разблокируется другой нитью, затем делает текущую нить владельцем *filehandle и увеличивает счётчик блокировок.

Функция funlockfile() уменьшает счётчик блокировок.

Функция ftrylockfile() является неблокирующей версией flockfile(). Она ничего не делает в том случае, если другая нить владеет *filehandle, в противном случае устанавливает статус владельца и увеличивает счётчик блокировок.

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

## ОШИБКИ
Нет.

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

Интерфейс

Атрибут

Значение

flockfile(), ftrylockfile(), funlockfile()

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

MT-Safe

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

## ДОСТУПНОСТЬ
Эти функции доступны, если определено _POSIX_THREAD_SAFE_FUNCTIONS.

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


floor

title: floor(3)

text:
# floor(3)

## ИМЯ
floor, floorf, floorl - поиск наибольшего целого значения не превышающего заданный аргумент

## ОБЗОР

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

```
double floor(double x);
float floorf(float x);
long double floorl(long double x);
```

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

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

floorf(), floorl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Данные функции возвращают наибольшее целое значение не превышающее x.

Например, результатом floor(0.5) будет 0.0, а floor(-0.5) — -1.0.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают целую часть от x.

Если x — целое, +0, -0, NaN или стремится к бесконечности, то будет возвращено значение x.

## ОШИБКИ
Ошибки не возникают. В документах POSIX.1-2001 описывается ошибка диапазона при переполнениях, однако см. ЗАМЕЧАНИЯ.

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

Интерфейс

Атрибут

Значение

floor(), floorf(), floorl()

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

MT-Safe

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

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

## ЗАМЕЧАНИЯ
В SUSv2 и POSIX.1-2001 есть текст о переполнении (которое может установить errno в ERANGE или вызвать исключение FE_OVERFLOW). На практике, результат не может выйти за диапазон ни на каком компьютере, поэтому обработка этой ошибки не имеет смысла (точнее говоря, переполнение возможно только в том случае, когда максимальное значение экспоненты меньше числа бит мантиссы. В стандарте IEEE-754 для 32- и 64-битных чисел с плавающей точкой максимальное значение экспоненты равно 128 и 1024 соответственно, а число бит мантиссы — 24 и 53 соответственно).

## СМОТРИТЕ ТАКЖЕ
ceil(3), lrint(3), nearbyint(3), rint(3), round(3), trunc(3)


fma

title: fma(3)

text:
# fma(3)

## ИМЯ
fma, fmaf, fmal - умножение и сложение чисел с плавающей запятой

## ОБЗОР

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

```
double fma(double x, double y, double z);
float fmaf(float x, float y, float z);
long double fmal(long double x, long double y, long double z);
```

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

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

fma(), fmaf(), fmal():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Эти функции вычисляют x * y + z. Результат округляется как единая тернарная операция согласно текущему режиму округления (смотрите fenv(3)).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают результат x * y + z, округлённый как для единой тернарной операции.

Если x или y равно NaN, то будет возвращено NaN.

Если x умноженное на y стремится к бесконечности и значение z равно минус бесконечности, то будет сгенерирована ошибка выхода за пределы области, а в качестве результата будет возвращено NaN.

Если x или y равно бесконечности, не равно 0 и z не равно NaN, то будет сгенерирована ошибка выхода за пределы области, а в качестве результата будет возвращено NaN.

Если x или y равно бесконечности, не равно 0, а z равно NaN, то будет сгенерирована ошибка выхода за пределы области, а в качестве результата будет возвращено NaN.

Если x умноженное на y не равно бесконечности умноженной на 0 (или наоборот) и значение z равно NaN, то будет возвращено NaN.

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

Если в результате исчерпана степень числа, возникает ошибка диапазона и возвращается 0 со знаком.

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Могут возникать следующие ошибки:

Ошибка области: x * y + z или x * y некорректно и z не равно NaN

Возникает исключение неправильной плавающей запятой (FE_INVALID).

Ошибка диапазона: результат превысил разрядность

Вызывается исключение переполнения плавающей точки (FE_OVERFLOW).

Ошибка диапазона: результат исчерпал степень

Возникает исключение исчерпания степени чисел с плавающей запятой (FE_UNDERFLOW).

Эти функции не изменяют errno.

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

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

Интерфейс

Атрибут

Значение

fma(), fmaf(), fmal()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
remainder(3), remquo(3)


fmax

title: fmax(3)

text:
# fmax(3)

## ИМЯ
fmax, fmaxf, fmaxl - определение максимального из двух чисел с плавающей запятой

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

double fmax(double x, double y); float fmaxf(float x, float y); long double fmaxl(long double x, long double y);

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

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

fmax(), fmaxf(), fmaxl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Данные функции возвращают большее значение из x и y.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают большее значение из x и y.

Если значение одного из аргументов равно NaN, то будет возвращено значение другого аргумента.

Если значение обоих аргументов равно NaN, то будет возвращено NaN.

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

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

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

Интерфейс

Атрибут

Значение

fmax(), fmaxf(), fmaxl()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
fdim(3), fmin(3)


fmemopen

title: fmemopen(3)

summary: открывает память как поток

text:
# fmemopen(3)

## ИМЯ
fmemopen - открывает память как поток

## ОБЗОР

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

```
FILE *fmemopen(void *buf, size_t size, const char *mode);
```

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

fmemopen():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция fmemopen() открывает поток, тип доступа указывается в mode. Поток позволяет выполнять операции ввода-вывода со строкой или буфером памяти, указанным в buf.

В аргументе mode задаётся семантика ввода-вывода потока и может указываться одно из следующих значений:

r

Поток открывается для чтения.

w

Поток открывается для записи.

a

Добавление; поток открывается для записи, начальное положение в буфере указывает на первый байт null.

r+

Поток открывается для чтения и записи.

w+

Поток открывается для чтения и записи. Содержимое буфера обрезается (то есть, в первый байт буфера помещается '\0').

a+

Добавление; поток открывается для чтения и записи, начальное положение в буфере указывает на первый байт null.

Для потока поддерживается понятие текущего положения — место, откуда будет выполнена следующая операция ввода-вывода. Текущее положение неявно обновляется операциями ввода-вывода. Оно может быть изменено явным образом с помощью fseek(3) и получено с помощью ftell(3). Во всех режимах кроме добавления, начальное положение указывает на начало буфера. В режиме добавления, если в буфере нет байта null, то начальное положение равно size+1.

Если значение buf равно NULL, то fmemopen() выделяет буфер длиной size байт. Это полезно для приложений, которым нужно записать данные во временный буфер и прочитать из него. Начальное положение указывает на начало буфера. Буфер автоматически освобождается при закрытии потока. Заметим, что вызывающий никогда не получит указатель на временный буфер, выделенный этим вызовом (но смотрите open_memstream(3)).

Если buf не равно NULL, то значение должно указывать на буфер длиной не менее len байт, выделенный вызывающим.

Когда поток, открытый на запись, сбрасывается (flushed) (fflush(3)) или закрывается (fclose(3)), то в конец буфера записывается байт null, если есть место. Вызывающий должен быть уверен, что в буфере есть место для дополнительного байта (и в size учитывается этот байт), чтобы это произошло.

В потоке, открытом на чтение, при обнаружении байтов null («\0») в буфере операции чтения не возвращают конец файла. Чтение из буфера будет возвращать конец файла, только когда текущее положение в буфере достигнет size байт от начала буфера.

Операции записи выполняются, или по текущему положению (для всех режимов, кроме добавления), или по текущему размеру потока (в режимах добавления).

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

setbuf(stream, NULL);

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

## ВЕРСИИ
Функция fmemopen() была доступна уже в glibc 1.0.x.

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

Интерфейс

Атрибут

Значение

fmemopen(),

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008. Эта функция не определена в POSIX.1-2001 и широко не распространена среди других систем.

В POSIX.1-2008 указано, что символ «b» в mode должен игнорироваться. Однако в Technical Corrigendum 1 изменили стандарт, позволив реализации решать что делать; это позволяет glibc учитывать «b».

## ЗАМЕЧАНИЯ
У файлового потока, возвращаемого этой функцией, отсутствует файловый дескриптор (т. е., если файловый поток передать в fileno(3), то произойдёт ошибка).

Начиная с версии 2.22 двоичный режим (смотрите ниже) был удалён, было исправлено много дефектов в реализации fmemopen() и для этого интерфейса был создан новый символ с версией.

### Двоичный режим
В версиях с 2.9 по 2.21 реализация fmemopen() в glibc поддерживает «двоичный» режим, включаемый в mode указанием вторым символа 'b'. В этом режиме при записи не выполняется неявное добавление конечного байта null и fseek(3) SEEK_END считается относительно конца буфера (т. е., значения, указанного в аргументе size), а не длины текущей строки.

Дефект программного интерфейса перешёл и в реализацию двоичного режима: для задания двоичного режима 'b' должен указываться вторым символом в mode. То есть, например, «wb+» сработает, а «w+b» — нет. Это не совпадает с трактовкой mode в fopen(3).

Двоичный режим удалён в glibc 2.22; указание 'b' в mode игнорируется.

## ДЕФЕКТЫ
В glibc до версии 2.22, если size равно нулю, то fmemopen() завершается с ошибкой EINVAL. Было бы логичней, если бы в этом случае успешно создавался поток, который затем бы возвращал конец файла при первой попытке его чтения; начиная с версии 2.22 реализация glibc поступает именно так.

В glibc до версии 2.22 указание в fmemopen() режима добавления («a» или «a+») устанавливает начальное положение в буфере на первый байт null, но (если положение сбрасывается в расположение, отличное от конца потока) не заставляет последующие операции записи выполнять добавление в конец потока. Этот дефект исправлен в glibc 2.22.

В glibc до версии 2.22, если в аргументе mode в fmemopen() включено добавление («a» или «a+») и аргумент size не учитывает байт null в buf, то согласно POSIX.1-2008 начальное положение буфера должно указывать на следующий байт за концом буфера. Однако, в этом случае glibc fmemopen() присваивает положению буфера значение -1. Этот дефект исправлен в glibc 2.22.

В glibc до версии 2.22 при вызове fseek(3) со значением whence, равным SEEK_END, и для потока, созданного fmemopen(), значение offset вычитается из положения конца потока, а не добавляется. Этот дефект исправлен в glibc 2.22.

При дополнении fmemopen() в glibc 2.9 «двоичным» режимом было потихоньку изменено ABI: раньше fmemopen() игнорировала «b» в mode.

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

```
$ ./a.out '1 23 43'
размер=11; ptr=1 529 1849
```

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

```
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define handle_error(msg) \

    do { perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{

    FILE *out, *in;

    int v, s;

    size_t size;

    char *ptr;

    if (argc != 2) {

        fprintf(stderr, "Использование: %s '<num>...'\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    in = fmemopen(argv[1], strlen(argv[1]), "r");

    if (in == NULL)

        handle_error("fmemopen");

    out = open_memstream(&ptr, &size);

    if (out == NULL)

        handle_error("open_memstream");

    for (;;) {

        s = fscanf(in, "%d", &v);

        if (s <= 0)

            break;

        s = fprintf(out, "%d ", v * v);

        if (s == -1)

            handle_error("fprintf");

    }

    fclose(in);

    fclose(out);

    printf("размер=%zu; ptr=%s\n", size, ptr);

    free(ptr);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
fopen(3), fopencookie(3), open_memstream(3)


fmin

title: fmin(3)

text:
# fmin(3)

## ИМЯ
fmin, fminf, fminl - определение минимального из двух чисел с плавающей запятой

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

double fmin(double x, double y);

float fminf(float x, float y);

long double fminl(long double x, long double y);

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

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

fmin(), fminf(), fminl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Данные функции возвращают меньшее значение из x и y.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают меньшее значение из x и y.

Если значение одного из аргументов равно NaN, то будет возвращено значение другого аргумента.

Если значение обоих аргументов равно NaN, то будет возвращено NaN.

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

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

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

Интерфейс

Атрибут

Значение

fmin(), fminf(), fminl()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
fdim(3), fmax(3)


fmod

title: fmod(3)

text:
# fmod(3)

## ИМЯ
fmod, fmodf, fmodl - функция получения остатка от деления числа с плавающей запятой

## ОБЗОР

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

```
double fmod(double x, double y);
float fmodf(float x, float y);
long double fmodl(long double x, long double y);
```

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

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

fmodf(), fmodl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции вычисляют остаток деления числа с плавающей запятой x на y. Возвращаемое значение: x - n * y, где n — частное x / y, округлённое к нулю до ближайшего целого числа.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функции возвращают значение x - n*y для некоторого целого n; при этом возвращаемое значение имеет тот же знак что и x, а абсолютное значение меньше абсолютного значения y.

Если x или y равно NaN, то будет возвращено NaN.

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

Если y равно 0, то будет сгенерирована ошибка выхода за пределы области, а в качестве результата будет возвращено NaN.

Если x равно +0 (-0) и y не равно, то возвращается +0 (-0).

## ОШИБКИ
Смотрите math_error(7), чтобы определить, какие ошибки могут возникать при вызове этих функций.

Могут возникать следующие ошибки:

Ошибка области: x стремится к бесконечности

errno устанавливается в EDOM (но см. ДЕФЕКТЫ). Возникает исключение неправильной плавающей точки (FE_INVALID).

Ошибка области: y равно 0

errno устанавливается в EDOM. Вызывается исключение неправильной плавающей точки (FE_INVALID).

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

Интерфейс

Атрибут

Значение

fmod(), fmodf(), fmodl()

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

MT-Safe

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

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

## ДЕФЕКТЫ
До версии 2.10 в реализации glibc при возникновении ошибки области переменная errno не устанавливалась в значение EDOM для бесконечного x.

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


fmtmsg

title: fmtmsg(3)

text:
# fmtmsg(3)

## ИМЯ
fmtmsg - выводит отформатированные сообщения об ошибках

## ОБЗОР

```
#include <fmtmsg.h>
```

```
int fmtmsg(long classification, const char *label,
           int severity, const char *text,
           const char *action, const char *tag);
```

## ОПИСАНИЕ
Эта функция выводит сообщение, описываемое аргументами, на устройство(а), заданное в аргументе classification. Для сообщений, записываемых в stderr, формат зависит от переменной окружения MSGVERB.

В аргументе label задаётся источник сообщения. Строка должна состоять из двух частей, разделённых двоеточиями; первая часть должна быть не более 10 символов, а вторая часть — не более 14.

В аргументе text описывается условие ошибки.

В аргументе action описываются возможные шаги по исправлению ошибки. Если они выводятся, то начинаются с «TO FIX: ».

В аргументе tag указывается ссылка на онлайн-документацию, в которой можно найти дополнительную информацию. Он должен содержать значение label и уникальный идентификационный номер.

### Фиктивные аргументы
Каждый аргумент может иметь фиктивное значение. Для фиктивного значения классификации (classification) MM_NULLMC (0L) ничего не выводится, то есть ничего не печатается. Фиктивное значение важности (severity) NO_SEV (0) указывается, если важность не определена. Значения MM_NULLLBL, MM_NULLTXT, MM_NULLACT, MM_NULLTAG являются синонимами ((char *) 0) — пустой строки, а MM_NULLSEV — синоним NO_SEV.

### Аргумент классификации
Аргумент classification — это сочетание значений, описывающих 4 типа информации.

Первое значение определяет канал вывода.

MM_PRINT

Вывод в stderr.

MM_CONSOLE

Вывод в системную консоль.

MM_PRINT | MM_CONSOLE

Вывод в оба места.

Вторым значением описывается источник ошибки.

MM_HARD

Произошла аппаратная ошибка.

MM_FIRM

Произошла ошибка в микропрограмме.

MM_SOFT

Произошла ошибка в программном обеспечении.

В третьем значении кодируется выявитель проблемы.

MM_APPL

Обнаружено приложением.

MM_UTIL

Обнаружено утилитой.

MM_OPSYS

Обнаружено операционной системой.

В четвёртом значении показывается важность инцидента:

MM_RECOVER

Это исправимая ошибка.

MM_NRECOV

Это неисправимая ошибка.

### Аргумент важности
В аргументе severity можно указать одно из следующих значений:

MM_NOSEV

Важность не печатается.

MM_HALT

Это значение печатается как ОСТАНОВ.

MM_ERROR

Это значение печатается как ОШИБКА.

MM_WARNING

Это значение печатается как ПРЕДУПРЕЖДЕНИЕ.

MM_INFO

Это значение печатается как ИНФОРМАЦИОННОЕ.

Числовые значения от 0 до 4. Используя функцию addseverity(3) или переменную окружения SEV_LEVEL вы можете добавить дополнительные уровни и строки для печати.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция может возвращать 4 значения:

MM_OK

Всё хорошо.

MM_NOTOK

Всё плохо.

MM_NOMSG

Ошибка записи в stderr.

MM_NOCON

Ошибка записи в консоль.

## ОКРУЖЕНИЕ
Переменная окружения MSGVERB (message verbosity — детальность сообщения) может использоваться для отключения некоторых частей вывода в stderr (она не влияет на вывод на консоль). Если эта переменная определена, не равна NULL и содержит список допустимых ключевых слов через двоеточие, то печатаются только части сообщения, которые соответствуют этим ключевым словам. Допустимые ключевые слова: «label», «severity», «text», «action» и «tag».

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

SEV_LEVEL=[описание[:описание[:...]]]

в окружении процесса перед первым вызовом fmtmsg() и каждое описание имеет вид

ключевое-слово-важности,уровень,печатаемая-строка

то fmtmsg() также будет обрабатывать заданные значения уровней (в дополнении к стандартным уровням 0–4), и использовать указанную строку печати, когда встречается такой уровень.

Часть «ключевое-слово-важности» не используется fmtmsg(), но указывается. Часть «уровень» — это строка, представляющая число. Числовое значение должно быть числом более 4. Это значение должно использоваться в аргументе важности fmtmsg() для выбора этого класса. Невозможно заменить любой из предопределённых классов. «Печатаемая-строка» — строка, которая печатается в случае, когда сообщение этого класса обрабатывается fmtmsg().

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

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

Интерфейс

Атрибут

Значение

fmtmsg()

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

glibc >= 2.16: MT-Safe glibc < 2.16: MT-Unsafe

До glibc 2.16 функция fmtmsg() использовала статическую незащищённую переменную, поэтому функцию нельзя использовать в нескольких нитях одновременно.

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

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции fmtmsg() и addseverity(3), и переменные окружения MSGVERB и SEV_LEVEL впервые появились в System V.

Функция fmtmsg() и переменная окружения MSGVERB описана в POSIX.1-2001 и POSIX.1-2008.

## ЗАМЕЧАНИЯ
В справочных страницах System V и UnixWare указано, что эти функции были заменены на «pfmt() и addsev()» или «pfmt(), vpfmt(), lfmt() и vlfmt()», и будут впоследствии удалены.

## ПРИМЕР

```
#include <stdio.h>
#include <stdlib.h>
#include <fmtmsg.h>
int
main(void)
{

    long class = MM_PRINT | MM_SOFT | MM_OPSYS | MM_RECOVER;

    int err;

    err = fmtmsg(class, "util-linux:mount", MM_ERROR,

                "неизвестный параметр mount", "Смотрите mount(8).",

                "util-linux:mount:017");

    switch (err) {

    case MM_OK:

        break;

    case MM_NOTOK:

        printf("Нечего печатать\n");

        break;

    case MM_NOMSG:

        printf("Нечего печатать в stderr\n");

        break;

    case MM_NOCON:

        printf("Нет вывода на консоль\n");

        break;

    default:

        printf("Неизвестная ошибка fmtmsg()\n");

    }

    exit(EXIT_SUCCESS);
}
```

Вывод должен быть таким:

```
util-linux:mount: ERROR: unknown mount option
TO FIX: Смотрите mount(8).  util-linux:mount:017
```

а после

```
MSGVERB=text:action; export MSGVERB
```

вывод станет:

```
неизвестный параметр mount

    TO FIX: Смотрите mount(8).
```

## СМОТРИТЕ ТАКЖЕ
addseverity(3), perror(3)