remainder

title: remainder(3)

summary: функция получения

text:
# remainder(3)

## ИМЯ
drem, dremf, dreml, remainder, remainderf, remainderl - функция получения остатка от деления числа с плавающей запятой

## ОБЗОР

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

```
/* Версии C99 */
double remainder(double x, double y);
float remainderf(float x, float y);
long double remainderl(long double x, long double y);
```

```
/* Устаревшие синонимы */
double drem(double x, double y);
float dremf(float x, float y);
long double dreml(long double x, long double y);
```

```

```

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

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

remainder():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

remainderf(), remainderl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

drem(), dremf(), dreml(): /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

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

## ОПИСАНИЕ
Данные функции вычисляют остаток от деления x на y. Возвращаемое значение равно x-n*y, где n равно значению x / y, округлённому до ближайшего целого. Если абсолютное значение x-n*y равно 0.5, то n выбирается целым.

Эти функции не подвержены действующему режиму округления (смотрите fenv(3)).

Функция drem() выполняет тоже самое.

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

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

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

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

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

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

Ошибка области: x стремится к бесконечности, а y не равно NaN

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

В этом случае функции не изменяют errno.

Ошибка области: y равно 0

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

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

Интерфейс

Атрибут

Значение

drem(), dremf(), dreml(), remainder(), remainderf(), remainderl()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции remainder(), remainderf() и remainderl() определены в C99 и POSIX.1-2001 и POSIX.1-2008.

Функция drem() появилась из 4.3BSD. Варианты функций dremf() и dreml() с типами float и long double есть в некоторых системах, таких как Tru64 и glibc2. Не используйте эти функции вместо remainder() и ей подобным.

## ДЕФЕКТЫ
До glibc 2.15 вызов

remainder(nan(""), 0);

возвращал NaN, как и ожидается, но некорректно приводит к ошибке области; Начиная с glibc 2.15, просто возвращается NaN (т. е., без ошибки области).

До glibc 2.15, errno не присваивалось EDOM пр ошибке области, возникающей когда x — бесконечность, а y не равно NaN.

## ПРИМЕР
Вызов «remainder(29.0, 3.0)» возвращает -1.

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


remove

package: man-pages-ru

title: remove(3)

summary: удаляет файл или каталог

text:
# remove(3)

## ИМЯ
remove - удаляет файл или каталог

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

int remove(const char *pathname);

## ОПИСАНИЕ
Функция remove() удаляет имя из файловой системы. Она вызывает unlink(2) для файлов и rmdir(2) для каталогов.

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

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

Если имя указывает на символьную ссылку, то будет удалена ссылка.

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

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

## ОШИБКИ
Ошибки, которые возникают у unlink(2) и rmdir(2).

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

Интерфейс

Атрибут

Значение

remove()

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

MT-Safe

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

## ДЕФЕКТЫ
Неточности в протоколе NFS могут приводить к неожиданному исчезновению файлов, которые всё ещё используются.

## СМОТРИТЕ ТАКЖЕ
rm(1), unlink(1), link(2), mknod(2), open(2), rename(2), rmdir(2), unlink(2), mkfifo(3), symlink(7)


remquo

title: remquo(3)

summary: остаток и неполное частное

text:
# remquo(3)

## ИМЯ
remquo, remquof, remquol - остаток и неполное частное

## ОБЗОР

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

```
double remquo(double x, double y, int *quo);
float remquof(float x, float y, int *quo);
long double remquol(long double x, long double y, int *quo);
```

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

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

remquo(), remquof(), remquol():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

Значение остатка тоже, что и при вычислении функцией remainder(3).

Значение, сохраняемое по указателю quo, имеет знак x / y и сохраняет от частного не менее 3 младших бит.

Например, remquo(29.0, 3.0) возвращает -1.0 и может сохранить 2. Заметим, что реальный остаток может не поместиться в integer.

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

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

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

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

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

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

Ошибка области: x стремится к бесконечности или y равно 0, и другой аргумент не равен NaN.

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

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

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

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

Интерфейс

Атрибут

Значение

remquo(), remquof(), remquol()

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

MT-Safe

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

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


resolver

title: resolver(3)

summary: процедуры определителя имён

text:
# resolver(3)

## ИМЯ
res_ninit, res_nclose, res_nquery, res_nsearch, res_nquerydomain, res_nmkquery, res_nsend, res_init, res_query, res_search, res_querydomain, res_mkquery, res_send, dn_comp, dn_expand - процедуры определителя имён

## ОБЗОР

```
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
```

```
struct __res_state;
typedef struct __res_state *res_state;
```

```
int res_ninit(res_state statep);
```

```
void res_nclose(res_state statep);
```

```
int res_nquery(res_state statep,
           const char *dname, int class, int type,
           unsigned char *answer, int anslen);
```

```
int res_nsearch(res_state statep,
           const char *dname, int class, int type,
           unsigned char *answer, int anslen);
```

```
int res_nquerydomain(res_state statep,
           const char *name, const char *domain,
           int class, int type, unsigned char *answer,
           int anslen);
```

```
int res_nmkquery(res_state statep,
           int op, const char *dname, int class,
           int type, const unsigned char *data, int datalen,
           const unsigned char *newrr,
           unsigned char *buf, int buflen);
```

```
int res_nsend(res_state statep,
           const unsigned char *msg, int msglen,
           unsigned char *answer, int anslen);
```

```
int dn_comp(const char *exp_dn, unsigned char *comp_dn,
           int length, unsigned char **dnptrs,
           unsigned char **lastdnptr);
```

```
int dn_expand(const unsigned char *msg,
           const unsigned char *eomorig,
           const unsigned char *comp_dn, char *exp_dn,
           int length);
```

### Устаревшие

```
extern struct __res_state _res;
```

```
int res_init(void);
```

```
int res_query(const char *dname, int class, int type,
           unsigned char *answer, int anslen);
```

```
int res_search(const char *dname, int class, int type,
           unsigned char *answer, int anslen);
```

```
int res_querydomain(const char *name, const char *domain,
           int class, int type, unsigned char *answer,
           int anslen);
```

```
int res_mkquery(int op, const char *dname, int class,
           int type, const unsigned char *data, int datalen,
           const unsigned char *newrr,
           unsigned char *buf, int buflen);
```

```
int res_send(const unsigned char *msg, int msglen,
           unsigned char *answer, int anslen);
```

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

## ОПИСАНИЕ
Замечание: Данная страница не полна (не описаны различные функции определителя, предоставляемые glibc) и, вероятно, содержит устаревшую информацию.

Описываемые далее функции выполняют запросы и обрабатывают ответы, полученные от серверов доменных имён Интернет.

В программный интерфейс входят как современные, реентерабельные функции, так и устаревшие не реентерабельные. Функции res_init() и res_query() из обычного интерфейса определителя использует статическое (глобальное) состояние, хранимое в структуре _res, что делает эти функции небезопасным при использовании в нитях. В BIND 8.2 появился набор новых интерфейсов res_ninit(), res_nquery() и т. п., в котором res_state указывается в третьем аргументе, что позволяет использовать отдельное состояние определителя в каждой нити.

Функции res_ninit() и res_init() читают файлы настройки (смотрите resolv.conf(5)) для получения имени домена по умолчанию и адреса(-ов) сервера имён. Если серверы не заданы, то используется локальный узел. Если не задан домен, то используется домен локального узла. Это может быть изменено через переменную окружения LOCALDOMAIN. Обычно, функция res_ninit() или res_init() выполняется первой из других функций. Каждый вызов res_nquery() требует соответствующего вызова res_nclose() для освобождения памяти, выделенной res_ninit() и последующими вызовами res_nquery().

Функции res_nquery() и res_query() запрашивают у сервера имён полное доменное имя name заданного типа type и класса class. Ответ помещается в буфер answer длиной anslen, указанный вызывающим.

Функции res_nsearch() и res_search() отправляют запрос и ждут ответа, подобно res_nquery() и res_query(), но при этом ещё учитывают правила работы и поиска по умолчанию, настраиваемые через RES_DEFNAMES и RES_DNSRCH (смотрите ниже описание параметров _res).

Функции res_nquerydomain() и res_querydomain() отправляют запрос с помощью res_nquery()/res_query() с объединённым name и domain.

Следующие функции являются процедурами низкого уровня, которые используются res_nquery()/res_query().

Функции res_nmkquery() и res_mkquery() создают сообщение-запрос в buf длиной buflen для имени домена dname. Типом запроса op может быть:

QUERY

Стандартный запрос.

IQUERY

Обратный запрос. Это значение было удалено в glibc 2.26, так как давно не поддерживалось серверами DNS.

NS_NOTIFY_OP

Уведомить об изменении SOA (Start of Authority) вторичный сервер.

Параметр newrr в настоящее время не используется.

Функции res_nsend() и res_send() посылают заранее созданный запрос, указанный в msg длиной msglen, и возвращают ответ в answer длиной anslen. Вызывают функцию res_ninit()/res_init(), если этого ещё не было.

Функция dn_comp() сжимает имя домена exp_dn и сохраняет его в буфере comp_dn длиной length. Сжатие использует массив указателей dnptrs на предварительно сжатые имена в текущем сообщении. Первый указатель обозначает начало сообщения, а весь список оканчивается NULL. Предел массива определяется в lastdnptr. Если dnptr равно NULL, то имя домена не является сжатым. Если lastdnptr равно NULL, то список меток не обновляется.

Функция dn_expand() раскрывает сжатое имя домена comp_dn до полного доменного имени, которое затем сохраняется в буфере exp_dn длиной length. Сжатое имя содержится в запросе или ответном сообщении, а msg указывает на начало сообщения.

Процедуры определителя используют настройки и информацию о состоянии из структуры __res_state (переданной в аргументе statep или в глобальной переменной _res, если используются старые не реентерабельные функции). Обычно, пользователь изменяет в этой структуре только поле options. Данное поле может содержать следующие значения, объединённые с помощью «OR»:

RES_INIT

Истинно, если уже вызывалась функция res_ninit() или res_init().

RES_DEBUG

Печатать отладочные сообщения. Этот параметр доступен только, если glibc собрана с включённой отладкой, которая по умолчанию выключена.

RES_AAONLY (не реализован; устарел в glibc 2.25)

Принимать только достоверные ответы. Функция res_send() продолжает работать, пока не найдёт достоверный ответ или возвращает ошибку. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.

RES_USEVC

использовать TCP-соединение для запросов вместо датаграмм UDP.

RES_PRIMARY (не реализован; устарел в glibc 2.25)

Запрашивать только первичный сервер имён. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.

RES_IGNTC

Игнорировать ошибки обрезания. Не пытаться повторить запрос с помощью TCP.

RES_RECURSE

Установить в запросах бит рекурсии. Рекурсия выполняется сервером доменных имён, а не функцией res_send() (включено по умолчанию).

RES_DEFNAMES

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

RES_STAYOPEN

Используется вместе с RES_USEVC для поддержания TCP-соединения запросов между ответами.

RES_DNSRCH

Если указан, то res_search() будет искать имена узлов в текущем и родительском домене. Этот параметр используется gethostbyname(3) (включено по умолчанию).

RES_INSECURE1

Принимать ответ от ошибочного сервера. Может использоваться для обнаружения потенциальных угроза безопасности, но требует перекомпиляции glibc с включённой отладкой и параметром RES_DEBUG (только для отладки).

RES_INSECURE2

Принимать ответ, который содержит некорректный запрос. Может использоваться для обнаружения потенциальных угроза безопасности, но требует перекомпиляции glibc с включённой отладкой и параметром RES_DEBUG (только для отладки).

RES_NOALIASES

Отключить использование переменной окружения HOSTALIASES.

RES_USE_INET6

Пытаться выполнить запрос AAAA раньше запроса A внутри функции gethostbyname(3), и отображать ответы IPv4 в «туннелированной форме» IPv6, если записи AAAA не были обнаружены, но есть запись типа A. Начиная с glibc 2.25 этот параметр считается устаревшим и при его использовании выдаётся предупреждение; приложения должны использовать getaddrinfo(3), а не gethostbyname(3).

RES_ROTATE

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

RES_NOCHECKNAME (не реализован; устарел в glibc 2.25)

Выключить в современном BIND проверку недопустимых символов в поступающих именах узлов и почтовых именах, таких как символы подчёркивания (_), не-ASCII или управляющие символы. Данный параметр имелся в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.

RES_KEEPTSIG (не реализован; устарел в glibc 2.25)

Не обрезать записи TSIG. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.

RES_BLAST (не реализован; устарел в glibc 2.25)

Посылать каждый запрос одновременно и рекурсивно всем серверам. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.

RES_USEBSTRING (glibc 2.3.4 по 2.24)

Выполнить поиск обратной записи IPv6 с помощью формата значимых битов, описанного в RFC 2673; если этот параметр не задан (по умолчанию), то используется полубайтовый формат. Данный параметр был удалён в glibc 2.25, так как он полагается на обратно несовместимое расширение DNS, которое никогда не разворачивалось в Интернете.

RES_NOIP6DOTINT (glibc 2.24 и старее)

Использовать зону ip6.arpa при поиске обратной записи IPv6 вместо ip6.int, которая устарела начиная с glibc 2.3.4. Данный параметр существует в glibc по версию 2.24 включительно (и включён по умолчанию). Из glibc 2.25 этот параметр был удалён.

RES_USE_EDNS0 (начиная с glibc 2.6)

Включить поддержку расширений DNS (EDNS0), описанных в RFC 2671.

RES_SNGLKUP (начиная с glibc 2.10)

По умолчанию, glibc начиная с версии 2.9 выполняет поиск по IPv4 и IPv6 параллельно. Некоторые приложения DNS-серверов не могут обработать такие запросы должным образом и делают паузу между ответами на запрос. Этот параметр отключает данное поведение, что заставляет glibc делать запросы IPv6 и IPv4 последовательно (что замедляет процесс определения имени).

RES_SNGLKUPREOP

Открывать для каждого запроса новый сокет, если указано значение RES_SNGLKUP.

RES_USE_DNSSEC

Использовать DNSSEC с битом OK в записи OPT. Это значение подразумевает RES_USE_EDNS0.

RES_NOTLDQUERY

Не искать неполное имя как домен верхнего уровня (TLD).

RES_DEFAULT

Значение по умолчанию подразумевает: RES_RECURSE, RES_DEFNAMES, RES_DNSRCH and RES_NOIP6DOTINT.

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

Функции res_nquery(), res_query(), res_nsearch(), res_search(), res_nquerydomain(), res_querydomain(), res_nmkquery(), res_mkquery(), res_nsend() и res_send() возвращают длину ответа или -1 при ошибке.

Функции dn_comp() и dn_expand() возвращают длину сжатого имени, или -1 при ошибках.

В случае завершения res_nquery(), res_query(), res_nsearch(), res_search(), res_nquerydomain() или res_querydomain() с ошибкой, по глобальной переменной h_errno (смотрите gethostbyname(3)) можно определить причину.

## ФАЙЛЫ
/etc/resolv.conf

файл с настройками резолвера

/etc/host.conf

файл с настройками резолвера

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

Интерфейс

Атрибут

Значение

res_ninit(), res_nclose(), res_nquery(), res_nsearch(), res_nquerydomain(), res_nsend()

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

MT-Safe locale

res_nmkquery(), dn_comp(), dn_expand()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
gethostbyname(3), resolv.conf(5), resolver(5), hostname(7), named(8)

Файл resolv/README из библиотеки GNU C.


rewinddir

title: rewinddir(3)

summary: сброс потока каталога

text:
# rewinddir(3)

## ИМЯ
rewinddir - сброс потока каталога

## ОБЗОР

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

```
#include <dirent.h>
```

```
void rewinddir(DIR *dirp);
```

## ОПИСАНИЕ
Функция rewinddir() сбрасывает текущее положение потока каталога dirp в начало каталога.

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

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

Интерфейс

Атрибут

Значение

rewinddir()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
closedir(3), opendir(3), readdir(3), scandir(3), seekdir(3), telldir(3)


rexec

title: rexec(3)

summary: возвращает поток удалённой команде

text:
# rexec(3)

## ИМЯ
rexec, rexec_af - возвращает поток удалённой команде

## ОБЗОР

```
#include <netdb.h>
```

```
int rexec(char **ahost, int inport, const char *user,
          const char *passwd, const char *cmd, int *fd2p);
```

```
int rexec_af(char **ahost, int inport, const char *user,
             const char *passwd, const char *cmd, int *fd2p,
             sa_family_t af);
```

rexec(), rexec_af():

```
    начиная с glibc 2.19:

        _DEFAULT_SOURCE

    в glibc до версии 2.19 включительно:

        _BSD_SOURCE
```

## ОПИСАНИЕ
Этот интерфейс устарел, используйте rcmd(3).

Функция rexec() ищет узел *ahost, используя gethostbyname(3), и возвращает -1, если узел не существует. В противном случае, *ahost присваивается стандартное имя узла. Если указаны имя пользователя и пароль, то они используются для аутентификации на другом узле; иначе происходит поиск соответствующей информации в окружении и затем в файле .netrc, находящемся в домашнем каталоге пользователя. Если всё это заканчивается с ошибкой, пользователь извещается об этом.

В inport указывается, какой хорошо известный (well-known) порт DARPA Internet нужно использовать для подключения; вызов getservbyname("exec", "tcp") (смотрите getservent(3)) вернёт указатель на структуру, которая содержит необходимый порт. Протокол подключения подробно описан в rexecd(8).

Если соединение успешно установлено, то вызывающему возвращается сокет в Интернет-домене типа SOCK_STREAM, который для удалённой команды считается stdin и stdout. Если fd2p не равно нулю, то устанавливается вспомогательный канал до управляющего процесса, а его файловый дескриптор будет помещён в *fd2p. Управляющий процесс возвращает диагностический вывод из команды (устройства 2) в этот канал, а также принимает байты из этого канала, считая их номерами сигналов UNIX, для их пересылки группе процессов команды. Возвращаемая диагностическая информация не содержит ошибки удалённой авторизации, так как второе подключение устанавливается после прохождения авторизации. Если fd2p равно 0, то stderr (устройство 2 удалённой команды) будет работать аналогично stdout и для отправки произвольных сигналов в удалённый процесс ничего не будет сделано, хотя вы сможете привлечь к себе внимание, используя внеполосную передачу данных.

### rexec_af()
Функция rexec() работает по протоколу IPv4 (AF_INET). В отличие от неё, rexec_af() предоставляет ещё один аргумент, af, который позволяет вызывающему выбрать протокол. В этом аргументе можно указать значения AF_INET, AF_INET6 или AF_UNSPEC (чтобы позволить реализации выбирать протокол).

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

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

Интерфейс

Атрибут

Значение

rexec(), rexec_af()

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

MT-Unsafe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции отсутствуют в POSIX.1. Функция rexec() впервые появилась в 4.2BSD, и есть в разных BSD, Solaris и других системах. Функция rexec_af() более новая и распространена гораздо меньше.

## ДЕФЕКТЫ
Функция rexec() посылает пароль через сеть в нешифрованном виде.

Считается, что лежащая в основе служба является большой дырой в безопасности, и поэтому не включена на большинстве сайтов; смотрите объяснение в rexecd(8).

## СМОТРИТЕ ТАКЖЕ
rcmd(3), rexecd(8)


rint

title: rint(3)

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

text:
# rint(3)

## ИМЯ
nearbyint, nearbyintf, nearbyintl, rint, rintf, rintl - округление до ближайшего целого

## ОБЗОР

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

```
double nearbyint(double x);
float nearbyintf(float x);
long double nearbyintl(long double x);
```

```
double rint(double x);
float rintf(float x);
long double rintl(long double x);
```

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

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

nearbyint(), nearbyintf(), nearbyintl():

_POSIX_C_SOURCE >= 200112L || _ISOC99_SOURCE

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

|| _XOPEN_SOURCE >= 500

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

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

rintf(), rintl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Функции nearbyint(), nearbyintf() и nearbyintl() округляют переданный аргумент до целого значения в формате с плавающей запятой в соответствии с текущим направлением округления (смотрите fesetround(3)) и не генерируют исключение о неточности. Когда текущее округление направлено к ближайшему целому, то в случае нахождения посереди между значениями эти функции округляют до чётного целого, в соответствии с IEEE-754.

Функции rint(), rintf() и rintl() делают то же самое, но генерируют исключение о неточности (FE_INEXACT, проверяется с помощью fetestexcept(3)), если результат отличается в значении от аргумента.

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

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

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

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

Интерфейс

Атрибут

Значение

nearbyint(), nearbyintf(), nearbyintl(), rint(), rintf(), rintl()

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

MT-Safe

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

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

Если вы хотите сохранить округлённое значение в целочисленном типе, то лучше использовать одну из функций, описанных в lrint(3).

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


round

title: round(3)

text:
# round(3)

## ИМЯ
round, roundf, roundl - округление до ближайшего целого в направлении от нуля

## ОБЗОР

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

```
double round(double x);
float roundf(float x);
long double roundl(long double x);
```

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

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

round(), roundf(), roundl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Эти функции округляют аргумент x до ближайшего целого значения, но при округлении в половине случаев используют направление округления от нуля (независимо от текущего направления округления, смотрите fenv(3)), вместо округления до ближайшего чётного целого, как это делает функция rint(3).

Например, результат round(0.5) будет равен 1.0, а round(-0.5) будет равен -1.0.

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

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

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

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

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

Интерфейс

Атрибут

Значение

round(), roundf(), roundl()

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

MT-Safe

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

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

Если вы хотите сохранить округлённое значение в целочисленном типе, то лучше использовать одну из функций, описанных в lround(3).

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


rpc

title: rpc(3)

text:
# rpc(3)

## ИМЯ
rpc - библиотечные функции для вызова удалённых процедур

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

Чтобы использовать эти функции, включите заголовочный файл <rpc/rpc.h>.

Представленные ниже прототипы позволяют использовать следующие типы:

```
typedef int bool_t;
```

```
typedef bool_t (*xdrproc_t) (XDR *, void *, ...);
```

```
typedef bool_t (*resultproc_t) (caddr_t resp,
                                struct sockaddr_in *raddr);
```

Объявления типов AUTH, CLIENT, SVCXPRT и XDR смотрите в заголовочных файлах.

```
void auth_destroy(AUTH *auth);
```

Макрос, который уничтожает аутентификационную информацию, связанную с auth. Уничтожение, обычно, вызывает высвобождение скрытых структур данных. Работа с auth после вызова auth_destroy() не описана.

```
AUTH *authnone_create(void);
```

Создаёт и возвращает аутентификационный описатель RPC, который передаёт непригодную аутентификационную информацию с каждым вызовом удалённой процедуры. Данная аутентификация используется в RPC по умолчанию.

```
AUTH *authunix_create(char *host, int uid, int gid,
                      int len, int *aup_gids);
```

Создаёт и возвращает аутентификационный описатель RPC, который содержит аутентификационную информацию. В параметре host содержится имя машины, на которой была создана информация; в uid содержится пользовательский идентификатор; в gid содержится идентификатор текущей группы пользователя; значения len и aup_gids описывают обновляемый (counted) массив групп, к которым принадлежит пользователь. Это упрощает персонализацию пользователя.

```
AUTH *authunix_create_default(void);
```

Вызывает authunix_create() с соответствующими параметрами.

```
int callrpc(char *host, unsigned long prognum,
            unsigned long versnum, unsigned long procnum,
            xdrproc_t inproc, char *in,
            xdrproc_t outproc, char *out);
```

Вызывает удалённую процедуру, связанную с prognum, versnum и procnum на машине host. В параметре in передаётся адрес параметров процедуры, в out — адрес, по которому должен помещаться результат; inproc используется для кодирования параметров процедуры, а outproc — для декодирования результатов. При успешном выполнении эта функция возвращает 0 или целое значение в enum clnt_stat при ошибке. Для перевода номера ошибки в сообщение об ошибке можно использовать функцию clnt_perrno().

Предупреждение: при вызове удалённой процедуры с помощью данной функции для передачи используется протокол UDP/IP; ограничения смотрите в описании clntudp_create(). При использовании данной функции вы не можете управлять задержкой или аутентификацией.

```
enum clnt_stat clnt_broadcast(unsigned long prognum,
                     unsigned long versnum, unsigned long procnum,
                     xdrproc_t inproc, char *in,
                     xdrproc_t outproc, char *out,
                     resultproc_t eachresult);
```

Подобна callrpc(), только сообщение посылается как широковещательное во все локально подключённые сети. Каждый раз при получении ответа эта функция вызывает eachresult() следующего вида:

```
eachresult(char *out, struct sockaddr_in *addr);

```

где out — тот же самый параметр out, переданный в clnt_broadcast(), за исключением того, что результат удалённой процедуры сразу же декодируется; addr указывает на адрес машины, которая послала результат. Если eachresult() возвращает 0, то clnt_broadcast() продолжит ждать ответы; в противном случае она возвращает соответствующий статус.

Предупреждение: размер широковещательных сокетов ограничен максимальной единицей передачи данных подключения. Для ethernet это значение равно 1500 байтам.

```
enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout);
```

Макрос, который вызывает удалённую процедуру procnum, связанную с клиентским описателем clnt, полученным от функции создания клиента RPC, такой как clnt_create(). Параметр in — адрес аргументов процедуры, а out — адрес, по которому размещается результат; inproc используется для кодирования параметров процедуры, а outproc используется для декодирования её результатов; tout — допустимое время ожидания результатов.

```
clnt_destroy(CLIENT *clnt);
```

Макрос, который уничтожает клиентский описатель RPC. Уничтожение, обычно, затрагивает скрытые структуры данных, включая сам clnt. Работа с clnt после вызова clnt_destroy() не описана. Если библиотека RPC открывала связанный сокет, он также будет закрыт. В противном случае сокет останется открытым.

```
CLIENT *clnt_create(char *host, unsigned long prog,
                    unsigned long vers, char *proto);
```

Основная функция для создания клиента. В host указывается имя удалённой машины, где где расположен сервер. В proto указывается тип протокола передачи, который будет использован. Поддерживаемые значения этого поля: «udp» и «tcp». Время задержки задаётся значением по умолчанию, но может быть изменено с помощью clnt_control().

Предупреждение: использование UDP имеет недостатки. Так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера.

```
bool_t clnt_control(CLIENT *cl, int req, char *info);
```

Макрос, используемый для изменения или получения различной информации о клиентском объекте. В req указывается тип операции, а в info — указатель на информацию. Для UDP и TCP поддерживаются следующие значения req и их типы параметров:

```
// назначить общее время ожидания
CLSET_TIMEOUT  struct timeval
// получить общее время ожидания
CLGET_TIMEOUT  struct timeval

```

Замечание: если вы установили время ожидания с помощью clnt_control(), то параметр времени ожидания, передаваемый clnt_call(), будет игнорироваться во всех будущих вызовах.

```
// получить адрес сервера
CLGET_SERVER_ADDR  struct sockaddr_in

```

Следующие операции действительны только для UDP:

```
// назначить повторное время ожидания
CLSET_RETRY_TIMEOUT  struct timeval
// получить повторное время ожидания
CLGET_RETRY_TIMEOUT  struct timeval

```

Повторное время — это время, в течение которого «UDP RPC» ждёт ответа от сервера перед повторной отправкой запроса.

```
clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out);
```

Макрос, который освобождает любые данные, размещаемые системой RPC/XDR, когда она декодирует результаты вызова RPC. Параметр out — адрес результатов, а outproc — функция XDR, описывающая результаты. Эта функция возвращает 1, если результаты были успешно освобождены и 0 в противном случае.

```
void clnt_geterr(CLIENT *clnt, struct rpc_err *errp);
```

Макрос, который копирует структуру ошибки клиентского описателя в структуру по адресу errp.

```
void clnt_pcreateerror(char *s);
```

Выводит в стандартный поток ошибок сообщение, описывающее почему клиентский описатель RPC не удалось создать. В начало сообщения добавляется строка s и знак двоеточия. Используется при ошибках в функциях clnt_create(), clntraw_create(), clnttcp_create() или clntudp_create().

```
void clnt_perrno(enum clnt_stat stat);
```

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

```
clnt_perror(CLIENT *clnt, char *s);
```

Выводит в стандартный поток ошибок сообщение, описывающее почему вызов RPC завершился с ошибкой. Значение clnt — описатель, использовавшийся при вызове. В начало сообщения добавляется строка s и знак двоеточия. Используется после clnt_call().

```
char *clnt_spcreateerror(char *s);
```

Похожа на clnt_pcreateerror(), но возвращает строку вместо вывода в стандартный поток ошибок.

Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове.

```
char *clnt_sperrno(enum clnt_stat stat);
```

Получает те же аргументы, что и clnt_perrno(), но вместо отправки в стандартный поток ошибок сообщения, которое показывает почему вызов RPC завершился с ошибкой, возвращает указатель на строку с сообщением. Строка заканчивается символом NEWLINE.

Функция clnt_sperrno() используется вместо clnt_perrno(), если программа не имеет стандартного потока ошибок (для программ, запущенных как сервер), или если программист не хочет выводить сообщения с помощью printf(3), или если формат сообщения отличается от формата, поддерживаемого clnt_perrno(). Замечание: в отличие от clnt_sperror() и clnt_spcreateerror(), clnt_sperrno() возвращает указатель на статические данные, но результат не будет переписан при каждом вызове.

```
char *clnt_sperror(CLIENT *rpch, char *s);
```

Похожа на clnt_perror(), но (подобно clnt_sperrno()) возвращает строку вместо вывода сообщения в стандартный поток ошибок.

Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове.

```
CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum);
```

Эта функция создаёт игрушечного клиента RPC для удалённой программы prognum версии versnum. Протокол, используемый для пересылки сообщения службе, на самом деле является буфером внутри адресного пространства процесса, поэтому соответствующий сервер RPC должен находиться в том же адресном пространстве; смотрите svcraw_create(). Он позволяет имитировать RPC и временные задержки без какого-либо участия ядра. При ошибке эта функция возвращает NULL..

```
CLIENT *clnttcp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                int *sockp, unsigned int sendsz, unsigned int recvsz);
```

Эта функция создаёт клиента RPC для удалённой программы prognum, версии versnum; для передачи клиент использует протокол TCP/IP. Удалённая программа расположена по интернет-адресу *addr. Если значение addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Так как в RPC на основе TCP используется буферизация ввода-вывода, пользователь может задать размер посылаемых и получаемых буферов с помощью параметров sendsz и recvsz; при значении 0 выбираются подходящие величины по умолчанию. При ошибке эта функция возвращает NULL.

```
CLIENT *clntudp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                struct timeval wait, int *sockp);
```

Эта функция создаёт клиента RPC для удалённой программы prognum версии versnum; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет-адресу *addr. Если addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Протокол UDP повторяет отправку сообщения через интервал, указанный в параметре wait, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется clnt_call().

Предупреждение: так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера.

```
CLIENT *clntudp_bufcreate(struct sockaddr_in *addr,
            unsigned long prognum, unsigned long versnum,
            struct timeval wait, int *sockp,
            unsigned int sendsize, unsigned int recosize);
```

Эта функция создаёт клиента RPC для удалённой программы prognum версии versnum; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет-адресу *addr. Если addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Протокол UDP повторяет отправку через интервал, указанный в параметре wait, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется clnt_call().

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

```
void get_myaddress(struct sockaddr_in *addr);
```

Заполнить IP-адрес машины в *addr, не используя библиотечные функции, которые работают с /etc/hosts. Номер порта всегда устанавливается равным htons(PMAPPORT).

```
struct pmaplist *pmap_getmaps(struct sockaddr_in *addr);
```

Пользовательский интерфейс службы portmap, который возвращает текущий список соответствий RPC-программа — порт, находящихся на машине с определённым IP-адресом *addr. Эта функция может возвратить NULL. Эту функцию использует команда rpcinfo -p.

```
unsigned short pmap_getport(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned int protocol);
```

Пользовательский интерфейс службы portmap, который возвращает номер порта, на котором ожидает подключения служба, поддерживающая программный номер prognum версии versnum, и отвечает по протоколу передачи, связанному с protocol. Обычно, значение protocol равно IPPROTO_UDP или IPPROTO_TCP. Возвращаемое значение 0 означает, что соответствия не существует или что RPC системы не может соединиться с удалённой службой portmap. В последнем случае глобальная переменная rpc_createerr содержит состояние RPC.

```
enum clnt_stat pmap_rmtcall(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout, unsigned long *portp);
```

Пользовательский интерфейс службы portmap, который указывает portmap на машине с IP-адресом *addr выполнить вызов RPC от вашего имени к процедуре на этой машине. При успешном выполнении процедуры параметр *portp заменяется на номер программного порта. Предназначение других параметров описано в callrpc() и clnt_call(). Эта функция может быть использована только для «ping». Смотрите также clnt_broadcast().

```
bool_t pmap_set(unsigned long prognum, unsigned long versnum,
                unsigned int protocol, unsigned short port);
```

Пользовательский интерфейс службы portmap, который устанавливает соответствие между [prognum,versnum,protocol] и port на машине с службой portmap. Обычно, значение protocol равно IPPROTO_UDP или IPPROTO_TCP. При успешном выполнении эта функция возвращает 1 и 0 в противном случае. Автоматически выполняется из svc_register().

```
bool_t pmap_unset(unsigned long prognum, unsigned long versnum);
```

Пользовательский интерфейс службы portmap, который уничтожает все соответствия между [prognum,versnum,*] и ports на машине с службой portmap. При успешном выполнении эта функция возвращает 1 и 0 в противном случае.

```
int registerrpc(unsigned long prognum, unsigned long versnum,
                unsigned long procnum, char *(*procname)(char *),
                xdrproc_t inproc, xdrproc_t outproc);
```

Регистрирует процедуру procname в пакете служб RPC. Если запрос приходит программе prognum версии versnum и процедуре procnum, то procname вызывается с указателем на эти параметры; procname должна возвращать указатель на эти статические результаты; inproc используется для декодирования параметров, а outproc — для кодирования результатов. При успешной регистрации эта функция возвращает 0 и -1 в противном случае.

Предупреждение: удалённые процедуры, зарегистрированные таким способом, доступны по протоколу UDP/IP; информацию об ограничениях смотрите в svcudp_create().

```
struct rpc_createerr rpc_createerr;
```

Глобальная переменная, значение которой устанавливается любой функцией создания клиента RPC при ошибке. Используйте функцию clnt_pcreateerror() для вывода сообщения о причине ошибки.

```
void svc_destroy(SVCXPRT *xprt);
```

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

```
fd_set svc_fdset;
```

Глобальная переменная, отражающая битовую маску читаемого файлового дескриптора службы RPC; она подходит в качестве параметра для системного вызова select(2). Полезна только, если реализация службы использует собственный обработчик асинхронных событий, а не вызова svc_run(). Эта переменная доступна только для чтения (не передавайте её адрес в select(2)!), также она может измениться после вызова svc_getreqset() или функций создания.

```
int svc_fds;
```

Подобна svc_fdset, но ограничена 32 файловыми дескрипторами. Устарела, используйте svc_fdset.

```
svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
```

Макрос, который освобождает любые данные, выделенные системой RPC/XDR при декодировании аргументов процедуры службы с помощью svc_getargs(). Эта функция возвращает 1, если результаты были успешно освобождены, и 0 в противном случае.

```
svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
```

Макрос, декодирующий параметры запроса RPC, связанного с описателем протокола службы RPC xprt. Параметр in — адрес, по которому будут размещены аргументы; inproc — функция XDR, использующаяся для декодирования аргументов. При успешном декодировании функция возвращает 1 и 0 в противном случае.

```
struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);
```

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

```
void svc_getreqset(fd_set *rdfds);
```

Функция представляет интерес, только если реализация службы не вызывает функцию svc_run(), а реализует собственную асинхронную обработку событий. Вызывается, когда системный вызов select(2) определил, что поступил запрос RPC в какой-либо сокет RPC; rdfds — битовая маска читаемого файлового дескриптора. Функция завершается после обработки всех сокетов, связанных со значением rdfds.

```
void svc_getreq(int rdfds);
```

Подобна svc_getreqset(), но ограничена 32 файловыми дескрипторами. Устарела, используйте svc_getreqset().

```
bool_t svc_register(SVCXPRT *xprt, unsigned long prognum,
                    unsigned long versnum,
                    void (*dispatch)(svc_req *, SVCXPRT *),
                    unsigned long protocol);
```

Связывает prognum и versnum с функцией распределения служб dispatch. Если значение protocol равно 0, то служба не регистрируется службой portmap. Если значение protocol не равно 0, тогда соответствие [prognum,versnum,protocol] и xprt->xp_port устанавливается локальной службой portmap (обычно, значение protocol равно 0, IPPROTO_UDP или IPPROTO_TCP). Функция dispatch имеет следующий вид:

```
dispatch(struct svc_req *request, SVCXPRT *xprt);

```

При успешном выполнении функция svc_register() возвращает 1 и 0 в противном случае.

```
void svc_run(void);
```

Эта функция не возвращает управление. Она ждёт поступления запросов RPC и при их появлении вызывает соответствующую процедуру службы с помощью svc_getreq(). Обычно, эта функция ждёт возврата из системного вызова select(2).

```
bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);
```

Вызывается функцией распределения служб RPC для отправки результатов вызову удалённой процедуры. Параметр xprt — описатель протокола связанного запроса; outproc — функция XDR, которая используется для кодирования результатов; out — адрес, по которому находятся результаты. При успешном выполнении эта функция возвращает 1 и 0 в противном случае.

```
void svc_unregister(unsigned long prognum, unsigned long versnum);
```

Удаляет все сопоставления [prognum,versnum] функциям распределения и [prognum,versnum,*] номеру порта.

```
void svcerr_auth(SVCXPRT *xprt, enum auth_stat why);
```

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

```
void svcerr_decode(SVCXPRT *xprt);
```

Вызывается функцией распределения служб, если невозможно декодировать её параметры. Смотрите также svc_getargs().

```
void svcerr_noproc(SVCXPRT *xprt);
```

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

```
void svcerr_noprog(SVCXPRT *xprt);
```

Вызывается, когда желаемая программа не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется.

```
void svcerr_progvers(SVCXPRT *xprt);
```

Вызывается, когда желаемая версия программы не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется.

```
void svcerr_systemerr(SVCXPRT *xprt);
```

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

```
void svcerr_weakauth(SVCXPRT *xprt);
```

Вызывается функцией распределения служб для отклонения вызова удалённой процедуры из недостатка параметров аутентификации. Функция вызывает svcerr_auth(xprt, AUTH_TOOWEAK).

```
SVCXPRT *svcfd_create(int fd, unsigned int sendsize,
                      unsigned int recvsize);
```

Создаёт службу поверх любого открытого файлового дескриптора. Обычно, этот файловый дескриптор является подключённым сокетом для поточного протокола, например TCP. В sendsize и recvsize указываются размеры буферов отправки и приёма. Если эти значения равны нулю, то выбирается приемлемое значение по умолчанию.

```
SVCXPRT *svcraw_create(void);
```

Эта функция создаёт игрушечный протокол службы RPC и возвращает указатель на него. В действительности протокол представляет собой буфер внутри адресного пространства процесса, поэтому соответствующие клиенты RPC должны находиться в том же адресном пространстве; смотрите clntraw_create(). Эта функция позволяет имитировать RPC и создавать дополнительные нагрузки на RPC (как, например, время пересылки туда и обратно) без какого-либо вмешательства ядра. При ошибке функция возвращает NULL.

```
SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size,
                       unsigned int recv_buf_size);
```

Эта функция создаёт протокол службы RPC на основе TCP/IP и возвращает указатель на него. Протокол связывается с сокетом sock, значение которого может быть равно RPC_ANYSOCK; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту TCP, то эта функция привязывает его к произвольному порту. При завершении xprt->xp_sock содержит дескриптор сокета протокола, а xprt->xp_port — номер порта протокола. При ошибке эта функция возвращает NULL. Так как в RPC на основе TCP используется буферизация ввода-вывода, пользователи могут задавать размер буферов; при нулевом значении выбирается подходящий размер по умолчанию.

```
SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize,
                          unsigned int recosize);
```

Эта функция создаёт протокол службы RPC на основе UDP/IP и возвращает указатель на него. Протокол связывается с сокетом sock, значение которого может быть равно RPC_ANYSOCK; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту UDP, то эта функция привязывает его к произвольному порту. При завершении xprt->xp_sock содержит дескриптор сокета протокола, а xprt->xp_port — номер порта протокола. При ошибке эта функция возвращает NULL.

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

```
SVCXPRT *svcudp_create(int sock);
```

Этот вызов аналогичен svcudp_bufcreate(sock,SZ,SZ) для некоторого размера SZ по умолчанию.

```
bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);
```

Используется для кодирования ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp);
```

Используется для описания информации (credentials) UNIX. Эта функция полезна для пользователей, которые хотят генерировать такую информацию без использования пакета аутентификации RPC.

```
void xdr_callhdr(XDR *xdrs, struct rpc_msg *chdr);
```

Используется для описания заголовка сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg);
```

Используется для описания сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap);
```

Используется для описания информационных сообщений аутентификации RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
bool_t xdr_pmap(XDR *xdrs, struct pmap *regs);
```

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

```
bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp);
```

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

```
bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr);
```

Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg);
```

Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

```
void xprt_register(SVCXPRT *xprt);
```

После создания описателей протокола службы RPC они должны самостоятельно зарегистрироваться в пакетом служб RPC. Эта функция изменяет глобальную переменную svc_fds. Обычно, для реализации служб эта функция не требуется.

```
void xprt_unregister(SVCXPRT *xprt);
```

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

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

Интерфейс

Атрибут

Значение

auth_destroy(), authnone_create(), authunix_create(), authunix_create_default(), callrpc(), clnt_broadcast(), clnt_call(), clnt_destroy(), clnt_create(), clnt_control(), clnt_freeres(), clnt_geterr(), clnt_pcreateerror(), clnt_perrno(), clnt_perror(), clnt_spcreateerror(), clnt_sperrno(), clnt_sperror(), clntraw_create(), clnttcp_create(), clntudp_create(), clntudp_bufcreate(), get_myaddress(), pmap_getmaps(), pmap_getport(), pmap_rmtcall(), pmap_set(), pmap_unset(), registerrpc(), svc_destroy(), svc_freeargs(), svc_getargs(), svc_getcaller(), svc_getreqset(), svc_getreq(), svc_register(), svc_run(), svc_sendreply(), svc_unregister(), svcerr_auth(), svcerr_decode(), svcerr_noproc(), svcerr_noprog(), svcerr_progvers(), svcerr_systemerr(), svcerr_weakauth(), svcfd_create(), svcraw_create(), svctcp_create(), svcudp_bufcreate(), svcudp_create(), xdr_accepted_reply(), xdr_authunix_parms(), xdr_callhdr(), xdr_callmsg(), xdr_opaque_auth(), xdr_pmap(), xdr_pmaplist(), xdr_rejected_reply(), xdr_replymsg(), xprt_register(), xprt_unregister()

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

MT-Safe

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

Руководства:

Remote Procedure Calls: Protocol Specification

Remote Procedure Call Programming Guide

rpcgen Programming Guide

RPC: Remote Procedure Call Protocol Specification, RFC 1050, Sun Microsystems, Inc., USC-ISI.


rpmatch

title: rpmatch(3)

text:
# rpmatch(3)

## ИМЯ
rpmatch - определяет, является ли ответ на вопрос утвердительным или отрицательным

## ОБЗОР

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

```
int rpmatch(const char *response);
```

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

rpmatch():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_SVID_SOURCE

## ОПИСАНИЕ
Функция rpmatch() обрабатывает ответ пользователя «да» или «нет» на вопросы, учитывая интернационализацию.

В аргументе response должен указываться ответ пользователя в виде строки, заканчивающейся null, полученной, например, с помощью fgets(3) или getline(3).

Пользовательские языковые настройки определяются с помощью переменных окружения LANG, LC_MESSAGES и LC_ALL, если для их учёта программа вызывала setlocale(3).

Вне зависимости от локали, ответы, соответствующие ^[Yy], всегда считаются утвердительными, а соответствующие ^[Nn], всегда принимаются за отрицательные.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
После проверки response, функция rpmatch() возвращает 0 при найденном отрицательном ответе («нет»), 1 при положительном ответе («да») и -1, когда значение response не распознано.

## ОШИБКИ
Возвращаемое значение -1 может указывать на неправильные входные данные, либо какую-то другую ошибку. Не стоит проверять является ли возвращаемое значение лишь отличным от нуля.

Функция rpmatch() может завершиться с ошибкой по любой из причин, по которым могут не выполниться regcomp(3) или regexec(3); причина ошибки не указывается в errno или где-то ещё — это указывает на ошибку в самом механизме regex (но этот случай не отличается от нераспознанных значений response).

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

Интерфейс

Атрибут

Значение

rpmatch()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция rpmatch() не является стандартной, но доступна в некоторых других системах.

## ДЕФЕКТЫ
Реализация rpmatch() учитывает лишь первый символ response. Так что, «ну, да.» вернёт 0, а «да нет же, ни за что!» вернёт 1. Правильнее было бы использовать расширенные правила для обработки входных строк (использования дополненных регулярных выражений описано в regex(7)): ^([yY]|yes|YES)$ и ^([nN]|no|NO)$.

## ПРИМЕР
Следующая программа показывает результаты, когда в rpmatch() передана строка, полученная программой из командной строки.

```
#define _SVID_SOURCE
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{

    if (argc != 2 || strcmp(argv[1], "--help") == 0) {

        fprintf(stderr, "%s response\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    setlocale(LC_ALL, "");

    printf("rpmatch() returns: %d\n", rpmatch(argv[1]));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
fgets(3), getline(3), nl_langinfo(3), regcomp(3), setlocale(3)


rtime

title: rtime(3)

summary: получение времени с удалённого узла

text:
# rtime(3)

## ИМЯ
rtime - получение времени с удалённого узла

## ОБЗОР

```
#include <rpc/auth_des.h>
```

```
int rtime(struct sockaddr_in *addrp, struct rpc_timeval *timep,
          struct rpc_timeval *timeout);
```

## ОПИСАНИЕ
Для получения времени с удалённого компьютера функция использует протокол Time Server Protocol, описанный в RFC 868.

Time Server Protocol возвращает время в секундах начиная с 1 января 1900 года 00:00:00 UTC. Данная функция самостоятельно вычитает подходящую константу для того, чтобы преобразовать результат в секундах от начала Эпохи — 1970-01-01 00:00:00 +0000 (UTC).

Если timeout не равно NULL, то будет использоваться сокет udp/time (порт 37), иначе — сокет tcp/time (порт 37).

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

## ОШИБКИ
Могут возникнуть все ошибки задействованных в работе функций (sendto(2), poll(2), recvfrom(2), connect(2), read(2)), а также:

EIO

Количество возвращённых байт не равно 4.

ETIMEDOUT

Время ожидания, указанное в таймауте, превышено.

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

Интерфейс

Атрибут

Значение

rtime()

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

MT-Safe

## ЗАМЕЧАНИЯ
Поддерживается только IPv4.

Некоторые версии in.timed поддерживают только TCP. Попробуйте пример программы с установленной в 1 значением use_tcp.

В libc5 используется прототип

```
    int rtime(struct sockaddr_in *, struct timeval *, struct timeval *);
```

для которого требуется <sys/time.h> вместо <rpc/auth_des.h>.

## ДЕФЕКТЫ
rtime() в glibc 2.2.5 и ниже на 64-битных компьютерах работает некорректно.

## ПРИМЕР
Для этого примера требуется поднятие и открытие порта 37. Вы можете проверить это, убедившись в том, что в файле /etc/inetd.conf запись time раскомментирована.

Программа подключается к компьютеру с именем «linux». Использование «localhost» не сработает. В качестве результата будет возвращено локальное время компьютера «linux».

```
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <rpc/auth_des.h>
#include <netdb.h>
static int use_tcp = 0;
static char *servername = "linux";
int
main(void)
{

    struct sockaddr_in name;

    struct rpc_timeval time1 = {0,0};

    struct rpc_timeval timeout = {1,0};

    struct hostent *hent;

    int ret;

    memset(&name, 0, sizeof(name));

    sethostent(1);

    hent = gethostbyname(servername);

    memcpy(&name.sin_addr, hent->h_addr, hent->h_length);

    ret = rtime(&name, &time1, use_tcp ? NULL : &timeout);

    if (ret < 0)

        perror("ошибка rtime");

    else {

        time_t t = time1.tv_sec;

        printf("%s\n", ctime(&t));

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
ntpdate(1), inetd(8)


rtnetlink

title: rtnetlink(3)

text:
# rtnetlink(3)

## ИМЯ
rtnetlink - макросы для обработки сообщений rtnetlink

## ОБЗОР
\#include <asm/types.h>

\#include <linux/netlink.h>

\#include <linux/rtnetlink.h>

\#include <sys/socket.h>

rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);

int RTA_OK(struct rtattr *rta, int rtabuflen);

void *RTA_DATA(struct rtattr *rta);

unsigned int RTA_PAYLOAD(struct rtattr *rta);

struct rtattr *RTA_NEXT(struct rtattr *rta, unsigned int rtabuflen);

unsigned int RTA_LENGTH(unsigned int length);

unsigned int RTA_SPACE(unsigned int length);

## ОПИСАНИЕ
Все сообщения rtnetlink(7) состоят из заголовка сообщений netlink(7) и дополнительных атрибутов. Атрибуты могут быть обработаны только описанными здесь макросами.

RTA_OK(rta, attrlen) возвращает истинное значение в случае, если rta указывает на правильный атрибут маршрутизации; attrlen — рабочая длина буфера атрибутов. Если возвращаемое значение ложно, то в сообщении больше нет атрибутов, даже если attrlen не равно нулю.

RTA_DATA(rta) возвращает указатель на начало данных атрибута.

RTA_PAYLOAD(rta) возвращает длину данных атрибута.

RTA_NEXT(rta, attrlen) считывает следующий за rta атрибут. Вызов этого макроса обновит attrlen. Для проверки правильности полученного указателя используйте RTA_OK.

RTA_LENGTH(len) возвращает длину, которая требуется для len байтов данных плюс заголовок.

RTA_SPACE(len) возвращает количество места, которое требуется для сообщения с данными длиной len байт.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данные макросы являются нестандартными расширениями Linux.

## ДЕФЕКТЫ
Данная справочная страница не полна.

## ПРИМЕР
Создание сообщения rtnetlink для установки MTU устройства:

```
#include <linux/rtnetlink.h>
...
struct {

    struct nlmsghdr  nh;

    struct ifinfomsg if;

    char             attrbuf[512];
} req;
struct rtattr *rta;
unsigned int mtu = 1000;
int rtnetlink_sk = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST;
req.nh.nlmsg_type = RTM_NEWLINK;
req.if.ifi_family = AF_UNSPEC;
req.if.ifi_index = INTERFACE_INDEX;
req.if.ifi_change = 0xffffffff; /* ??? */
rta = (struct rtattr *)(((char *) &req) +

                         NLMSG_ALIGN(req.nh.nlmsg_len));
rta->rta_type = IFLA_MTU;
rta->rta_len = RTA_LENGTH(sizeof(unsigned int));
req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) +

                              RTA_LENGTH(sizeof(mtu));
memcpy(RTA_DATA(rta), &mtu, sizeof(mtu));
send(rtnetlink_sk, &req, req.nh.nlmsg_len, 0);
```

## СМОТРИТЕ ТАКЖЕ
netlink(3), netlink(7), rtnetlink(7)


scalb

title: scalb(3)

text:
# scalb(3)

## ИМЯ
scalb, scalbf, scalbl - умножает число с плавающей запятой на основание в степени целого числа (УСТАРЕЛИ)

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

double scalb(double x, double exp);

float scalbf(float x, float exp);

long double scalbl(long double x, long double exp);

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

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

scalb():

_XOPEN_SOURCE >= 500

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

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

scalbf(), scalbl(): _XOPEN_SOURCE >= 600

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

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

## ОПИСАНИЕ
Эти функции умножают свой первый аргумент x на FLT_RADIX (обычно, 2), возведённый в степень exp, то есть:

```
    x * FLT_RADIX ** exp
```

Определение значения FLT_RADIX можно получить включив файл <float.h>.

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

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

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

Если x равно +0 (-0), и exp не положительная бесконечность, то возвращается +0 (-0).

If x равно нулю и exp — положительная бесконечность, то будет сгенерирована ошибка выхода за пределы области, а в качестве результата будет возвращено NaN.

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

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

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

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

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

Ошибка области: x равно 0, и exp — положительная бесконечность, или x — положительная бесконечность и exp — отрицательная бесконечность, а другой аргумент не NaN.

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

scalb(), scalbf(), scalbl()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция scalb() определена в POSIX.1-2001, но помечена как устаревшая. Из POSIX.1-2008 удалено описание scalb(), рекомендуется использовать scalbln(3), scalblnf(3) или scalblnl(3). Функция scalb() впервые появилась в 4.3BSD.

Функции scalbf() и scalbl() не стандартизованы; несмотря на это, scalbf() есть в нескольких системах

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


scalbln

title: scalbln(3)

summary: умножает число с

text:
# scalbln(3)

## ИМЯ
scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl - умножает число с плавающей запятой на основание в степени целого числа

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

double scalbln(double x, long int exp);

float scalblnf(float x, long int exp);

long double scalblnl(long double x, long int exp);

double scalbn(double x, int exp);

float scalbnf(float x, int exp);

long double scalbnl(long double x, int exp);

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

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

scalbln(), scalblnf(), scalblnl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

scalbn(), scalbnf(), scalbnl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции умножают свой первый аргумент x на FLT_RADIX (обычно, 2), возведённый в степень exp, то есть:

```
    x * FLT_RADIX ** exp
```

Определение значения FLT_RADIX можно получить включив файл <float.h>.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

scalbn(), scalbnf(), scalbnl(), scalbln(), scalblnf(), scalblnl()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Эти функции отличаются от устаревших функций, описанных в scalb(3), типом второго аргумента. У функций, описанных здесь, второй аргумент имеет целочисленный тип, а у описанных в scalb(3) второй аргумент имеет тип double.

Если FLT_RADIX равно 2 (обычно), то scalbn() эквивалентна ldexp(3).

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


scandir

title: scandir(3)

summary: ищет записи в каталоге

text:
# scandir(3)

## ИМЯ
scandir, scandirat, alphasort, versionsort - ищет записи в каталоге

## ОБЗОР

```
#include <dirent.h>
```

```
int scandir(const char *dirp, struct dirent ***namelist,
```

```
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
```

```
int alphasort(const struct dirent **a, const struct dirent **b);
```

```
int versionsort(const struct dirent **a, const struct dirent **b);
#include <fcntl.h>          /* определения констант AT_* */
#include <dirent.h>
```

```

```

int scandirat(int dirfd, const char *dirp, struct dirent ***namelist,

```
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
```

```

```

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

scandir(), alphasort():

/* начиная с glibc 2.10: */ _POSIX_C_SOURCE >= 200809L

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

versionsort(): _GNU_SOURCE

scandirat(): _GNU_SOURCE

## ОПИСАНИЕ
Функция scandir() обходит каталог dirp, вызывая filter() для каждой записи каталога. Записи, для которых filter() возвращает не ноль, сохраняются в строках, выделяемых с помощью malloc(3), сортируются qsort(3) с помощью функции сравнения compar() и собираются в массиве namelist, который выделяется с помощью malloc(3). Если filter равно NULL, то выбираются все записи.

В качестве функции сравнения compar() можно использовать alphasort() и versionsort(). Первая сортирует записи (строки (*a)->d_name и (*b)->d_name) каталога с помощью strcoll(3), а последняя с помощью strverscmp(3).

### scandirat()
Системный вызов scandirat() работает также как системный вызов scandir(), за исключением случаев, описанных здесь.

Если в dirp задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в scandir()).

Если в dirp задан относительный путь и значение dirfd равно AT_FDCWD, то dirp рассматривается относительно текущего рабочего каталога вызывающего процесса (как scandir()).

Если в dirp задан абсолютный путь, то dirfd игнорируется.

Смотрите в openat(2) объяснение необходимости scandirat().

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

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

## ОШИБКИ
ENOENT

Путь в dirp не существует.

ENOMEM

Недостаточно памяти для завершения операции.

ENOTDIR

Путь в dirp не является каталогом.

В scandirat() дополнительно могут возникнуть следующие ошибки:

EBADF

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

ENOTDIR

Значение dirp содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.

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

Функция scandirat() впервые появилась в glibc 2.15.

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

Интерфейс

Атрибут

Значение

scandir(), scandirat()

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

MT-Safe

alphasort(), versionsort()

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

MT-Safe locale

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

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

## ЗАМЕЧАНИЯ
Начиная с glibc 2.1, alphasort() вызывает strcoll(3); раньше в ней использовалась strcmp(3).

До glibc 2.10, два аргумента alphasort() и versionsort() имели тип const void *. После стандартизации alphasort() в POSIX.1-2008, тип аргумента argument стал типобезопасным const struct dirent **, и в glibc 2.10 функция alphasort() (и нестандартная versionsort()) была приведена в соответствие со стандартом.

## ПРИМЕР
Программа, показанная ниже, печатает список файлов в текущем каталоге в обратном порядке.

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

```
#define _DEFAULT_SOURCE
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{

    struct dirent **namelist;

    int n;

    n = scandir(".", &namelist, NULL, alphasort);

    if (n == -1) {

        perror("scandir");

        exit(EXIT_FAILURE);

    }

    while (n--) {

        printf("%s\n", namelist[n]->d_name);

        free(namelist[n]);

    }

    free(namelist);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
closedir(3), fnmatch(3), opendir(3), readdir(3), rewinddir(3), seekdir(3), strcmp(3), strcoll(3), strverscmp(3), telldir(3)


scanf

title: scanf(3)

summary: преобразует данные в

text:
# scanf(3)

## ИМЯ
scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - преобразует данные в соответствии с форматом

## ОБЗОР

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

```
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
#include <stdarg.h>
```

```
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
```

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

vscanf(), vsscanf(), vfscanf():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Группа функций scanf() считывает вводимую информацию в соответствии с форматом format так, как описано ниже. В формате могут указываться определители преобразования (conversion specifications); результаты каждого преобразования, если они производились, сохраняются по адресам параметров указателей, передаваемых после format. Каждый параметр указатель должен быть того же типа, что и значение, получаемое в результате преобразования данных в соответствии с форматом.

Если количество определителей преобразования в format превышает количество параметров указателей, то результат не определён. Если количество параметров указателей превышает количество определителей преобразования, то лишние параметры указатели вычисляются, но игнорируются.

Функция scanf() считывает информацию из стандартного потока ввода stdin; fscanf() считывает информацию из потока, на который указывает stream, а sscanf() считывает информацию из символьной строки, на которую указывает str.

Функция vfscanf() является аналогом vfprintf(3) и читает информацию из потока, на который указывает указатель stream, используя список указателей переменной длины (смотрите stdarg(3)). Функция vscanf() считывает список параметров переменной длины из стандартного ввода, а функция vsscanf() считывает его из строки. Эти функции являются аналогами функций vprintf(3) и vsprintf(3), соответственно.

Строка format состоит из последовательности инструкций (directives), которые описывают порядок обработки входных символов. Если обработка инструкции завершается с ошибкой, то чтение прекращается и scanf() завершает работу. «Отказом» может быть: ошибка ввода, то есть недоступность входных символов или ошибка совпадения, то есть получены неподходящие данные (смотрите далее).

Инструкцией может быть:

•

Последовательность пробельных символов (пробел, табуляция, символ новой строки и т. д.; смотрите isspace(3)). Эта инструкция совпадает с любым количеством пустого места, включая отсутствие данных.

•

Обычный символ (т. е., отличный от пробельного или «%»). Такой символ должен точно совпадать со следующим символом входных данных.

•

Определитель преобразования, который начинается с символа «%» (процент). Последовательность символов ввода преобразуется в соответствии с определителем, а результат помещается в соответствующий параметр указатель. Если следующий элемент ввода не соответствует определителю преобразования, то преобразование завершается с ошибкой — ошибкой совпадения.

Каждый определитель преобразования в format начинается с символа «%» или последовательности символов «%n$» (смотрите о разнице далее) за которым следует:

•

Необязательный символ подавления назначения «*»: scanf() читает данные как предписано определителем преобразования, но отбрасывает их. Соответствующий параметр указатель необязателен, и этот определитель не учитывается в счётчике успешных назначений, возвращаемом scanf().

•

Для десятичных преобразований необязательный символ кавычки ('). Указывает, что входное число можно содержать разделитель тысяч, определяемый категорией LC_NUMERIC текущей локали (смотрите setlocale(3).) Символ кавычки может быть до или после символа подавления '*'.

•

Необязательный символ «m». Используется в строковых преобразованиях (%s, %c, %[) и освобождает вызывающего от необходимости выделять соответствующий буфер для хранения входных данных: вместо этого scanf() выделяет буфер достаточного размера и присваивает адрес этого буфера соответствующему параметру указателю, который должен быть указателем на переменную char * (эту переменную не нужно инициализировать перед вызовом). Вызывающий должен вызвать free(3) для этого буфера, как только он станет ненужным.

•

Необязательное целое десятичное число, которое задаёт максимальную ширину поля. Чтение символов прерывается по достижении этого максимума или при нахождении несовпадающего символа, неважно что случится раньше. В большинстве преобразований начальные пробельные символы отбрасываются (исключения приведены далее), и эти отброшенные символы не учитываются в максимальной ширине поля. В преобразованных строках ввода сохраняется конечный байт null ('\0') для отметки конца ввода; в максимальной ширине поля он также не учитывается.

•

Необязательный символ модификатора типа. Например, модификатор типа l используется в преобразованиях целых чисел, например с помощью %d, для указания того, что соответствующий параметр указатель ссылается на long int, а не на int.

•

Определитель преобразования, который задаёт тип входного преобразования.

Определители преобразования в format бывают двух видов: начинающиеся с «%» и начинающиеся с «%n$». Эти два вида не должны использоваться одновременно в строке format, за исключением случая, когда строка, содержащая определители «%n$», может включать %% и %*. Если в format содержатся определители «%», то они задаются в порядке появления параметров указателей, указанных после. В форме «%n$» (есть в POSIX.1-2001, но отсутствует в C99), n — это десятичное целое, которое задаёт в какое место должен быть помещён ввод, то есть указывает на расположение n-го параметра указателя, передаваемого после format.

### Преобразования
Следующие символы модификаторов типа (type modifier characters) могут появляться в определении преобразования:

h

Обозначает, что преобразование будет одним из d, i, o, u, x, X или n и следующий указатель является указателем на short int или на unsigned short int (но не int).

hh

Как h, но следующий указатель — указатель на signed char или unsigned char.

j

Как h, но следующий указатель — указатель на intmax_t или uintmax_t. Этот модификатор появился в C99.

l

Обозначает, что преобразование будет одним из d, i, o, u, x, X или n и следующий указатель является указателем на long int или unsigned long int (но не int), или что преобразование будет одним из e, f или g и следующий указатель является указателем на double (но не float). Указание двух символов l эквивалентно L. Если используется с %c или %s, то соответствующий параметр считается указателем на широкий символ или строку широких символов, соответственно.

L

Обозначает, что преобразование будет одним из e, f или g и следующий указатель является указателем на long double или преобразование будет одним из d, i, o, u или x и следующий указатель является указателем на long long.

q

Эквивалентен L. Данный определитель отсутствует в ANSI C.

t

Как h, но следующий указатель — указатель на ptrdiff_t. Этот модификатор появился в C99.

z

Как h, но следующий указатель — указатель на size_t. Этот модификатор появился в C99.

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

%

Совпадает с литерой «%». То есть %% в строке формата соответствует одиночному символу данных «%». Преобразование не выполняется (но начальные пробельные символы отбрасываются) и назначения не происходит.

d

Совпадает с необязательным знаковым десятичным целым; следующий указатель должен быть указателем на int.

D

Эквивалентно ld; оставлено только для обратной совместимости (замечание: есть только в libc4. В libc5 и glibc %D просто игнорируется, что приводит к непонятным ошибкам в старых программах).

i

Совпадает с необязательным знаковым целым; следующий указатель должен быть указателем на int. Целое считывается как шестнадцатеричное число, если начинается с 0x или 0X, как восьмеричное, если начинается с 0 и как десятичное в остальных случаях. Используются только символы, подходящие для работы с выбранным основанием системы счисления.

o

Совпадает с необязательным беззнаковым восьмеричным целым; следующий указатель должен быть указателем на unsigned int.

u

Совпадает с необязательным беззнаковым десятичным целым; следующий указатель должен быть указателем на unsigned int.

x

Совпадает с необязательным беззнаковым шестнадцатеричным целым; следующий указатель должен быть указателем на unsigned int.

X

Эквивалентно x.

f

Совпадает с необязательным знаковым числом с плавающей запятой; следующий указатель должен быть указателем на float.

e

Эквивалентно f.

g

Эквивалентно f.

E

Эквивалентно f.

a

(C99) Эквивалентно f.

s

Совпадает с последовательностью непробельных символов; следующий указатель должен указывать на первый элемент массива символов достаточной длины для сохранения входной последовательности и завершающего байта null ('\0'), который добавляется автоматически. Входная строка обрывается при появлении пробельного символа или достижении максимальной ширины поля, неважно что случится раньше.

c

Совпадает с последовательностью символов, чья длина задаётся максимальной шириной поля (по умолчанию 1); следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов (завершающий байт null не добавляется). Обычный пропуск начальных пробелов не выполняется. Чтобы пропустить пробелы, явно укажите их в формате.

[

Совпадает с непустой последовательностью символов из задаваемого набора допустимых символов; следующий указатель должен быть указателем на char и должно быть достаточно места для всех символов в строке плюс завершающий байт null. Обычный пропуск начальных пробелов не выполняется. Строка будет состоять (или нет) из символов определённого набора; набор задаётся указанием символов между символом открывающей скобки [ и закрывающей скобки ]. Набором определяются исключающиеся символы, если первым символом после открывающей скобки является символ диакритического знака (^). Чтобы включить закрывающую скобку в набор, укажите её первым символом после открывающей скобки или диакритического знака; в любой другой позиции она закрывает набор. Символ переноса - также является специализированным; если он указывается между двумя символами, то в набор добавляются все лежащие в промежутке символы. Чтобы добавить в набор символ переноса укажите его последним, перед конечной закрывающей скобкой. Например, [^]0-9-] означает, что «все символы, кроме закрывающей скобки, цифр от 0 до 9 и переноса». Строка обрывается при появлении символа не из набора (или, при указании символа диакритического знака, из) или при достижении ширины поля.

p

Совпадает со значением указателя (как выводится при %p в printf(3)); следующий указатель должен быть указателем на void.

n

Ничего не ожидается; вместо этого количество символов, использованных к настоящему времени из ввода, сохраняется по следующему указателю, который должен быть указателем на int. Это не преобразование и не увеличивает счётчик, возвращаемый функцией. Назначение может подавляться при указании символа подавления назначения *, но влияние этого на возвращаемое значение не определено. Поэтому преобразования %*n лучше не использовать.

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

Если конец входных данных был достигнут раньше, чем произошло хотя бы одно совпадение или при ошибке совпадения возвращается значение EOF. Значение EOF также возвращается при ошибке чтения; в этом случае для потока устанавливается индикатор ошибки (смотрите ferror(3)), а в errno указывается номер ошибки.

## ОШИБКИ
EAGAIN

Файловый дескриптор stream помечен как неблокирующий, а чтение вызвало бы блокировку.

EBADF

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

EILSEQ

Из входной байтовой последовательности невозможно создать корректный символ.

EINTR

Операция чтения была прервана сигналом; смотрите signal(7).

EINVAL

Недостаточно параметров или format равен NULL.

ENOMEM

Не хватает памяти.

ERANGE

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

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

Интерфейс

Атрибут

Значение

scanf(), fscanf(), sscanf(), vscanf(), vsscanf(), vfscanf()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции fscanf(), scanf() и sscanf() соответствуют C89, C99 и POSIX.1-2001. В этих стандартах не определена ошибка ERANGE.

Определитель q в 4.4BSD используется для long long, а определители ll или L используются в GNU для преобразования целых чисел.

Версия Linux этих функций основана на библиотеке GNU libio. Более точное описание функций можно найти в документации в формате info на GNU libc (glibc-1.08).

## ЗАМЕЧАНИЯ

### Модификатор выделения-назначения «a»
Первоначально, в библиотеке GNU C поддерживалось динамическое выделение памяти для входных строк при указании символа a (нестандартное расширение) (это свойство существует до glibc 2.0). То есть можно указать scanf() выделить буфер под входную строку, передав в указателе только указатель на буфер *buf:

char *buf;

scanf("%as", &buf);

Использование буквы a для этой цели проблематично, так как a также используется в стандарте ISO C как синоним f (ввод данных с плавающей запятой). В POSIX.1-2008 для назначения с выделением определён модификатор m (смотрите в ОПИСАНИЕ выше).

Заметим, что модификатор a недоступен, если программа скомпилирована посредством gcc -std=c99 или gcc -D_ISOC99_SOURCE (если не определён _GNU_SOURCE); в этом случае a рассматривается как определитель чисел с плавающей запятой (смотрите выше).

Поддержка модификатора m была добавлена в glibc начиная с версии 2.7, и в новых программах нужно использовать этот модификатор вместо a.

Стандартизированный в POSIX модификатор m имеет дополнительные преимущества над a:

- Он может также применяться к определителям преобразования %c (например, %3mc).

- Исчезает неоднозначность с определителем преобразования чисел с плавающей запятой %a (не подвержен влиянию gcc -std=c99).

## ДЕФЕКТЫ
Все функции полностью соответствуют C89, но предоставляют дополнительные определители q и a, а также дополнительные возможности определителей L и l. Последнее может считаться дефектом, так как это изменяет поведение определителей, заданное в C89.

Некоторые комбинации модификаторов типов и определителей преобразования, определённые в ANSI C, не имеют смысла (например, %Ld). Хотя они могут иметь хорошо описанное поведение в Linux, это не обязательно так на других архитектурах. Поэтому, обычно, лучше использовать модификаторы, не определённые в ANSI C, то есть использовать q вместо L в комбинации с преобразованием d, i, o, u, x и X или ll.

Работа q отличается от работы в 4.4BSD, так как может использоваться при преобразовании вещественных числе подобно L.

## ПРИМЕР
Чтобы использовать определитель динамического выделения при преобразовании, укажите m в качестве модификатора длины (в виде %ms или %m[диапазон]). Вызывающий должен вызвать free(3) для возвращённой строки как в следующем примере:

```
char *p;
int n;
errno = 0;
n = scanf("%m[a-z]", &p);
if (n == 1) {

    printf("чтение: %s\n", p);

    free(p);
} else if (errno != 0) {

    perror("scanf");
} else {

    fprintf(stderr, "Нет совпадающих символов\n");
}
```

Как показано в примере выше, необходимо вызывать free(3) только, если при вызове scanf() была прочитана строка.

## СМОТРИТЕ ТАКЖЕ
getc(3), printf(3), setlocale(3), strtod(3), strtol(3), strtoul(3)


title: sched_getcpu(3)

text:
# sched_getcpu(3)

## ИМЯ
sched_getcpu - определяет ЦП, на котором выполняется вызывающая нить

## ОБЗОР

```
#include <sched.h>
```

```
int sched_getcpu(void);
```

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

sched_getcpu():

Начиная с glibc 2.14:

_GNU_SOURCE

До glibc 2.14:

_BSD_SOURCE || _SVID_SOURCE

/* также достаточно _GNU_SOURCE */

## ОПИСАНИЕ
sched_getcpu() возвращает номер центрального процессора, на котором выполняется вызывающая нить.

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

## ОШИБКИ
ENOSYS

В данном ядре getcpu(2) не реализован.

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

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

Интерфейс

Атрибут

Значение

sched_getcpu()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
sched_getcpu() есть только в glibc.

## ЗАМЕЧАНИЯ
Вызов

```
cpu = sched_getcpu();
```

эквивалентен следующему вызову getcpu(2):

```
int c, s;
s = getcpu(&c, NULL, NULL);
cpu = (s == -1) ? s : c;
```

## СМОТРИТЕ ТАКЖЕ
getcpu(2), sched(7)


seekdir

title: seekdir(3)

text:
# seekdir(3)

## ИМЯ
seekdir - установить позицию для последующего вызова readdir() в потоке каталога.

## ОБЗОР

```
#include <dirent.h>
```

```
void seekdir(DIR *dirp, long loc);
```

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

seekdir():

_XOPEN_SOURCE

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

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

## ОПИСАНИЕ
Функция seekdir() устанавливает в потоке каталога позицию, с которой начнёт работу следующий вызов readdir(2). Аргумент loc должен быть значением, которое возвращается ранее вызванной функцией telldir(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция seekdir() не возвращает никаких значений.

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

Интерфейс

Атрибут

Значение

seekdir()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В glibc до версии 2.1.1 тип аргумента loc был off_t. В POSIX.1-2001 он имеет тип long, и это учтено в glibc начиная с версии 2.1.2. В telldir(3) читайте почему нужно быть осторожным в своих предположениях о значении в этом аргументе.

## СМОТРИТЕ ТАКЖЕ
lseek(2), closedir(3), opendir(3), readdir(3), rewinddir(3), scandir(3), telldir(3)


title: sem_close(3)

summary: закрывает именованный семафор

text:
# sem_close(3)

## ИМЯ
sem_close - закрывает именованный семафор

## ОБЗОР

```
#include <semaphore.h>
```

```
int sem_close(sem_t *sem);
```

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

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

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

## ОШИБКИ
EINVAL

Значение sem не является корректным для семафора.

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

Интерфейс

Атрибут

Значение

sem_close()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Все открытые именные семафоры автоматически закрываются при завершении процесса или при execve(2).

## СМОТРИТЕ ТАКЖЕ
sem_getvalue(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), sem_overview(7)


title: sem_destroy(3)

summary: уничтожает безымянный семафор

text:
# sem_destroy(3)

## ИМЯ
sem_destroy - уничтожает безымянный семафор

## ОБЗОР

```
#include <semaphore.h>
```

```
int sem_destroy(sem_t *sem);
```

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

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

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

Уничтожение семафора, заблокированного другим процессом или нитью (в sem_wait(3)), приводит к непредсказуемым последствиям.

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

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

## ОШИБКИ
EINVAL

Значение sem не является корректным для семафора.

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

Интерфейс

Атрибут

Значение

sem_destroy()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
sem_init(3), sem_post(3), sem_wait(3), sem_overview(7)


title: sem_getvalue(3)

summary: возвращает значение семафора

text:
# sem_getvalue(3)

## ИМЯ
sem_getvalue - возвращает значение семафора

## ОБЗОР

```
#include <semaphore.h>
```

```
int sem_getvalue(sem_t *sem, int *sval);
```

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

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

Если один или более процессов или нитей заблокированы в ожидании блокировки семафора с помощью sem_wait(3), то в этом случае в POSIX.1 разрешено возвращать два варианта значения sval: 0 или отрицательное число, чьё абсолютное значение равно количеству процессов и нитей заблокированных в sem_wait(3). В Linux используется первый вариант.

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

## ОШИБКИ
EINVAL

Значение sem не является корректным для семафора.

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

Интерфейс

Атрибут

Значение

sem_getvalue()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Значение семафора может уже быть изменено при возврате sem_getvalue().

## СМОТРИТЕ ТАКЖЕ
sem_post(3), sem_wait(3), sem_overview(7)