package: man-pages-ru

title: CPU_SET(3)

summary: макросы для работы с наборами ЦП

text:
# CPU_SET(3)

## ИМЯ
CPU_SET, CPU_CLR, CPU_ISSET, CPU_ZERO, CPU_COUNT, CPU_AND, CPU_OR, CPU_XOR, CPU_EQUAL, CPU_ALLOC, CPU_ALLOC_SIZE, CPU_FREE, CPU_SET_S, CPU_CLR_S, CPU_ISSET_S, CPU_ZERO_S, CPU_COUNT_S, CPU_AND_S, CPU_OR_S, CPU_XOR_S, CPU_EQUAL_S - макросы для работы с наборами ЦП

## ОБЗОР

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

```
void CPU_ZERO(cpu_set_t *set);
```

```
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_CLR(int cpu, cpu_set_t *set);
int  CPU_ISSET(int cpu, cpu_set_t *set);
```

```
int  CPU_COUNT(cpu_set_t *set);
```

```
void CPU_AND(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_OR(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_XOR(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
```

```
int  CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2);
```

```
cpu_set_t *CPU_ALLOC(int num_cpus);
void CPU_FREE(cpu_set_t *set);
size_t CPU_ALLOC_SIZE(int num_cpus);
```

```
void CPU_ZERO_S(size_t setsize, cpu_set_t *set);
```

```
void CPU_SET_S(int cpu, size_t setsize, cpu_set_t *set);
void CPU_CLR_S(int cpu, size_t setsize, cpu_set_t *set);
int  CPU_ISSET_S(int cpu, size_t setsize, cpu_set_t *set);
```

```
int  CPU_COUNT_S(size_t setsize, cpu_set_t *set);
```

```
void CPU_AND_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_OR_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_XOR_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
```

```
int  CPU_EQUAL_S(size_t setsize, cpu_set_t *set1, cpu_set_t *set2);
```

## ОПИСАНИЕ
Набор ЦП описывается структурой данных cpu_set_t. Набор ЦП используется в sched_setaffinity(2) и подобных интерфейсах.

Тип данных cpu_set_t реализован в виде битовой маски. Однако структуру данных следует считать «чёрным ящиком»: все действия с наборами ЦП следует выполнять с помощью макросов, описанных на этой странице.

Для работы с набором ЦП set предоставляются следующие макросы:

CPU_ZERO()

Очищает set, после этого он не содержит ЦП.

CPU_SET()

Добавляет ЦП cpu в set.

CPU_CLR()

Удаляет ЦП cpu из set.

CPU_ISSET()

Проверяет, является ли ЦП cpu членом set.

CPU_COUNT()

Возвращает количество ЦП в set.

Макросы, имеющие аргумент cpu, не вызывают побочных эффектов, все перечисленные выше макросы могут использовать аргумент более одного раза.

Значение первого ЦП системы в cpu обозначается как 0, значение следующего ЦП в cpu равно 1 и т. д. Нельзя предполагать о доступности каких-либо ЦП, или что набор ЦП непрерывен, так как ЦП могут динамически отключаться или вообще отсутствовать. Константой CPU_SETSIZE (в настоящее время 1024) задаётся значение на 1 большее, чем максимальный номер ЦП, который можно хранить в cpu_set_t.

Следующие макросы выполняют логические операции над наборами ЦП:

CPU_AND()

Сохраняет пересечение наборов srcset1 и srcset2 в destset (который может быть одним из наборов-аргументов).

CPU_OR()

Сохраняет объединение наборов srcset1 и srcset2 в destset (который может быть одним из наборов-аргументов).

CPU_XOR()

Сохраняет результат XOR наборов srcset1 и srcset2 в destset (который может быть одним из наборов-аргументов). Операция XOR возвращает набор из ЦП, которые есть в одном из srcset1 или srcset2, но не в обоих одновременно.

CPU_EQUAL()

Проверяет, что два набора ЦП содержат одинаковые ЦП.

### Динамически изменяемые наборы ЦП
Так как некоторым приложениям может потребоваться наборы ЦП динамически изменяемых размеров (например, для выделения наборов больше, чем определено стандартным типом данных cpu_set_t), glibc предоставляет набор макросов для этого.

Следующие макросы используются для выделения и удаления наборов ЦП:

CPU_ALLOC()

Выделяет набор ЦП, достаточный для хранения ЦП в диапазоне от 0 до num_cpus-1.

CPU_ALLOC_SIZE()

Возвращает размер набора ЦП в байтах, который необходим для хранения ЦП в диапазоне от 0 до num_cpus-1. Данный макрос предоставляет значение, которое можно использовать в аргументе setsize в макросах CPU_*_S(), описанных далее.

CPU_FREE()

Освобождает набор ЦП, выделенный ранее с помощью CPU_ALLOC().

Макросы, чьи имена заканчиваются на «_S», аналогичны макросам с тем же именем без суффикса. Эти макросы выполняют те же задачи что и их аналоги, но они работают с динамически выделяемыми наборами ЦП, размер которых равен setsize байт.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Макросы CPU_ISSET() и CPU_ISSET_S() возвращают ненулевое значение, если cpu есть в set; в противном случае возвращается 0.

Макросы CPU_COUNT() и CPU_COUNT_S() возвращают количество ЦП в set.

Макросы CPU_EQUAL() и CPU_EQUAL_S() возвращают ненулевое значение, если два набора ЦП одинаковы; в противном случае возвращается 0.

При успешном выполнении макрос CPU_ALLOC() возвращает указатель, при ошибке возвращается NULL (ошибки те же, что и у malloc(3)).

Макрос CPU_ALLOC_SIZE() возвращает количество байт, требуемое для хранения набора ЦП указанных элементов.

Остальные функции не возвращают никаких значений.

## ВЕРСИИ
Макросы CPU_ZERO(), CPU_SET(), CPU_CLR() и CPU_ISSET() добавлены в glibc версии 2.3.3.

Макрос CPU_COUNT() впервые появилась в glibc версии 2.6.

Макросы CPU_AND(), CPU_OR(), CPU_XOR(), CPU_EQUAL(), CPU_ALLOC(), CPU_ALLOC_SIZE(), CPU_FREE(), CPU_ZERO_S(), CPU_SET_S(), CPU_CLR_S(), CPU_ISSET_S(), CPU_AND_S(), CPU_OR_S(), CPU_XOR_S() и CPU_EQUAL_S() впервые появились в glibc версии 2.7.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данные интерфейсы есть только в Linux.

## ЗАМЕЧАНИЯ
Для создания копии набора ЦП используйте memcpy(3).

Так как наборы ЦП это битовые маски, выделяемые в единицах длинных слов, реальное количество ЦП в динамически выделенном наборе ЦП будет округлено до следующего кратного sizeof(unsigned long). Приложение должно считать содержимое этих дополнительных бит неопределённым.

Несмотря на похожесть имён, заметим, что константа CPU_SETSIZE определяет количество ЦП в типе данных cpu_set_t (то есть, эффективное количество битов в битовой маске), в то время как аргумент setsize макросов CPU_*_S() — это размер в байтах.

Типы данных параметров и возвращаемых значений, показанных в ОБЗОРЕ — подсказки, что ожидается в каждом случае. Однако так как эти интерфейсы реализованы как макросы, компилятор не обязательно поймает все ошибки приведения типов, если вы нарушите предположения.

## ДЕФЕКТЫ
На 32-разрядных платформах в glibc 2.8 и ранее CPU_ALLOC () выделяет вдвое больше пространства, как требуется, и CPU_ALLOC_SIZE() возвращает значение вдвое большее, чем должно. Эта ошибка не должна влиять на семантику программы, но приводит к трате впустую памяти и менее эффективной работе макросов для динамически выделяемых наборов ЦП. Эти ошибки исправлены в glibc версии 2.9.

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

```
#define _GNU_SOURCE
#include <sched.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <assert.h>
int
main(int argc, char *argv[])
{

    cpu_set_t *cpusetp;

    size_t size;

    int num_cpus, cpu;

    if (argc < 2) {

        fprintf(stderr, "Использование: %s <количество-ЦП>\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    num_cpus = atoi(argv[1]);

    cpusetp = CPU_ALLOC(num_cpus);

    if (cpusetp == NULL) {

        perror("CPU_ALLOC");

        exit(EXIT_FAILURE);

    }

    size = CPU_ALLOC_SIZE(num_cpus);

    CPU_ZERO_S(size, cpusetp);

    for (cpu = 0; cpu < num_cpus; cpu += 2)

        CPU_SET_S(cpu, size, cpusetp);

    printf("CPU_COUNT() набора:    %d\n", CPU_COUNT_S(size, cpusetp));

    CPU_FREE(cpusetp);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
sched_setaffinity(2), pthread_attr_setaffinity_np(3), pthread_setaffinity_np(3), cpuset(7)

branch: sisyphus


INFINITY

title: INFINITY(3)

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

text:
# INFINITY(3)

## ИМЯ
INFINITY, NAN, HUGE_VAL, HUGE_VALF, HUGE_VALL - константы величин с плавающей запятой

## ОБЗОР

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

```
INFINITY
```

```
NAN
```

```
HUGE_VAL
HUGE_VALF
HUGE_VALL
```

## ОПИСАНИЕ
Макрос INFINITY расширяет до константы float, представляющую положительную бесконечность.

Макрос NAN расширяет до константы float, представляющую не нарушающее (quiet) NaN (если поддерживается). Не нарушающее NaN — это NaN («не число»), которое не вызывает исключений при использовании в арифметических действиях. Обратное — сигнализирующее (signaling) NaN. Смотрите IEC 60559:1989.

Макросы HUGE_VAL, HUGE_VALF, HUGE_VALL расширяют до констант с типами double, float и long double, соответственно, которые представляют большое положительное число, возможно положительную бесконечность.

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

## ДОСТУПНОСТЬ
В системах с glibc макрос HUGE_VAL доступен всегда. Доступность макроса NAN можно проверить с помощью #ifdef NAN; это же относится и к INFINITY, HUGE_VALF, HUGE_VALL. Они будут определены в <math.h>, если определён _ISOC99_SOURCE, _GNU_SOURCE или __STDC_VERSION__ и это значение не меньше чем 199901L.

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


title: MB_CUR_MAX(3)

text:
# MB_CUR_MAX(3)

## ИМЯ
MB_CUR_MAX - максимальная длина многобайтового символа, для текущей локали

## ОБЗОР

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

## ОПИСАНИЕ
Макрос MB_CUR_MAX определяет целочисленное выражение, задающее максимальное количества байтов необходимых для представления единственного широкого символа в текущей локали. Данное значение зависит от локали и поэтому не является постоянным времени-компиляции.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Целое число в диапазоне [1, MB_LEN_MAX]. Значение 1 обозначает традиционное 8-разрядное кодирование символов.

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

## СМОТРИТЕ ТАКЖЕ
MB_LEN_MAX(3), mblen(3), mbstowcs(3), mbtowc(3), wcstombs(3), wctomb(3)


title: MB_LEN_MAX(3)

text:
# MB_LEN_MAX(3)

## ИМЯ
MB_LEN_MAX - максимальная длина многобайтового символа, для всех локалей

## ОБЗОР

```
#include <limits.h>
```

## ОПИСАНИЕ
Макрос MB_LEN_MAX представляет собой максимальное количества байтов, необходимых для представления единственного широкого символа, в любой из поддерживаемых локалей.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Это постоянное значение больше нуля.

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

## ЗАМЕЧАНИЯ
Элементы MB_LEN_MAX и sizeof(wchar_t) никак не связаны друг с другом. В glibc значение MB_LEN_MAX, обычно, равно 16 (6 в glibc до версии 2.2), а sizeof(wchar_t) равно 4.

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


title: __ppc_get_timebase(3)

summary: возвращают текущее значение

text:
# __ppc_get_timebase(3)

## ИМЯ
__ppc_get_timebase, __ppc_get_timebase_freq - возвращают текущее значение базового регистра времени на архитектуре Power и его частоту

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

uint64_t __ppc_get_timebase(void)

uint64_t __ppc_get_timebase_freq(void);

## ОПИСАНИЕ
Функция __ppc_get_timebase() читает текущее значение базового регистра времени (Time Base Register) и возвращает его значение, а __ppc_get_timebase_freq() возвращает частоту обновления базового регистра времени.

Базовый регистр времени — это 64-битный регистр процессоров с архитектурой Power. В нём хранится монотонно увеличивающееся значение, которое обновляется с зависимой от системы частотой, которая может отличаться от частоты процессора.

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

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

## ВЕРСИИ
Поддержка __ppc_get_timebase() в библиотеку GNU C было добавлена в версию 2.16, а __ppc_get_timebase_freq() доступна начиная с версии 2.17.

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

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

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

```
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/platform/ppc.h>
/* максимальное значение базового регистра времени: 2^60 - 1.

   Источник: POWER ISA.  */
#define MAX_TB 0xFFFFFFFFFFFFFFF
int
main(void)
{

    uint64_t tb1, tb2, diff;

    uint64_t freq = __ppc_get_timebase_freq();

    printf("Базовая частота времени = %"PRIu64" Hz\n", freq);

    tb1 = __ppc_get_timebase();

    // что-то делаем…

    tb2 = __ppc_get_timebase();

    if (tb2 > tb1) {

        diff = tb2 - tb1;

    } else {

        /* базовый регистр времени переполнился */

        diff = (MAX_TB - tb2) + tb1;

    }

    printf("Прошло  = %1.2f мкс\n",

            (double) diff * 1000000 / freq );

    exit(EXIT_SUCCESS);
}
```

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


title: __ppc_set_ppr_med(3)

summary: изменяет регистр приоритета

text:
# __ppc_set_ppr_med(3)

## ИМЯ
__ppc_set_ppr_med, __ppc_set_ppr_very_low, __ppc_set_ppr_low, __ppc_set_ppr_med_low, __ppc_set_ppr_med_high - изменяет регистр приоритета программы

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

void __ppc_set_ppr_med(void);

void __ppc_set_ppr_very_low(void);

void __ppc_set_ppr_low(void);

void __ppc_set_ppr_med_low(void);

void __ppc_set_ppr_med_high(void);

## ОПИСАНИЕ
Эти функции предоставляют доступ к Program Priority Register (PPR, регистру приоритета программы) архитектуры Power.

PPR — это 64-битный регистр, которой управляет приоритетом программы. Изменяя значение PPR, программист может улучшить системную производительность, сделав использование системных ресурсов более эффективным, особенно в ситуациях конкурентного доступа. Доступные непривилегированные состояния достигаются следующими функциями:

- Функция __ppc_set_ppr_med() устанавливает регистр приоритета программы равным среднему значению (по умолчанию).

- Функция __ppc_set_ppr_very_low() устанавливает регистр приоритета программы равным очень низкому значению.

- Функция __ppc_set_ppr_low() устанавливает регистр приоритета программы равным низкому значению.

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

Привилегированное состояние выше среднего также может быть установлено на определённые временные интервалы (непривилегированными) программами в режиме задачи (problem-state) следующей функцией:

*

Функция __ppc_set_ppr_med_high() устанавливает регистр приоритета программы равным значению выше среднего.

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

## ВЕРСИИ
Функции __ppc_set_ppr_med(), __ppc_set_ppr_low() и __ppc_set_ppr_med_low() имеются в glibc начиная с версии 2.18. Функции __ppc_set_ppr_very_low() и __ppc_set_ppr_med_high() впервые появились в glibc в версии 2.23.

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

Интерфейс

Атрибут

Значение

__ppc_set_ppr_med(), __ppc_set_ppr_very_low(), __ppc_set_ppr_low(), __ppc_set_ppr_med_low(), __ppc_set_ppr_med_high()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Функции __ppc_set_ppr_very_low() и __ppc_set_ppr_med_high() будут определены из <sys/platform/ppc.h>, если определён _ARCH_PWR8. Доступность этих функций можно проверить с помощью #ifdef _ARCH_PWR8.

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

Power ISA, Book II - Section 3.1 (Program Priority Registers)


title: __ppc_yield(3)

summary: подсказать процессору освободить

text:
# __ppc_yield(3)

## ИМЯ
__ppc_yield, __ppc_mdoio, __ppc_mdoom - подсказать процессору освободить общие ресурсы

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

void __ppc_yield(void);

void __ppc_mdoio(void);

void __ppc_mdoom(void);

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

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

Функция __ppc_mdoio() даёт подсказку, что производительность будет, вероятно, улучшена, если совместно используемые ресурсы, выделенные выполняющему процессору, высвободить, пока не завершится отложенный доступ к хранилищу с запрещённым кэшем (caching-inhibited storage).

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

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

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

Интерфейс

Атрибут

Значение

__ppc_yield(), __ppc_mdoio(), __ppc_mdoom()

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

MT-Safe

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

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

Power ISA, Book II - Section 3.2 ("or" architecture)


title: __setfpucw(3)

text:
# __setfpucw(3)

## ИМЯ
__setfpucw - устанавливает слово управления FPU для архитектуры i386 (устарела)

## ОБЗОР
\#include <i386/fpu_control.h>

void __setfpucw(unsigned short control_word);

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

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

## ЗАМЕЧАНИЯ
Начиная с glibc 2.1 эта функция не существует. Для управления режимами округления FPU в ISO C99 введены новые функции (прототипы объявлены в <fenv.h>): fegetround(3), fesetround(3), окружением при работе с плавающей точкой: fegetenv(3), feholdexcept(3), fesetenv(3), feupdateenv(3) и для управления исключениями FPU: feclearexcept(3), fegetexceptflag(3), feraiseexcept(3), fesetexceptflag(3) и fetestexcept(3).

Если по какой-то причине необходим прямой доступ к слову управления FPU, то можно использовать макросы _FPU_GETCW и _FPU_SETCW из <fpu_control.h>.

## ПРИМЕР
__setfpucw(0x1372)

Устанавливает слово управления FPU на архитектуре i386:

- включает расширенную точность

- включает округление к ближайшему

- включает исключение при переполнении, делении на ноль и NaN

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

<fpu_control.h>


title: a64l(3)

summary: преобразование между типами long и base\-64

text:
# a64l(3)

## ИМЯ
a64l, l64a - преобразование между типами long и base-64

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

long a64l(const char *str64);

char *l64a(long value);

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

a64l(), l64a():

_XOPEN_SOURCE >= 500

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

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

## ОПИСАНИЕ
Эти функции обеспечивают преобразование между 32-битными типами long integer и строками little-endian base-64 ASCII (длиной от 0 до 6). Если строка, используемая как аргумент для a64l(), имеет длину более шести, то будут использованы только первые 6 байтов. Если в типе long более 32 битов, то l64a() будет использовать только младшие 32 бита значения value, а a64l() расширит на знак свой 32-битный результат.

64 цифры в системе кодирования base-64:

```
'.'	представляет 0
'/'	представляет 1
0-9	представляет  2-11
A-Z	представляет 12-37
a-z	представляет 38-63
```

Пример: 123 = 59*64^0 + 1*64^1 = "v/".

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

Интерфейс

Атрибут

Значение

l64a()

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

MT-Unsafe race:l64a

a64l()

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

MT-Safe

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

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

Поведение l64a() не определено, если value отрицательно. Если значение value равно нулю, то возвращается пустая строка.

Эти функции работают неправильно в glibc до версии 2.2.5 (сначала помещают самые старшие разряды).

Это не та кодировка, которая используется в uuencode(1).

## СМОТРИТЕ ТАКЖЕ
uuencode(1), strtoul(3)


abort

title: abort(3)

summary: аварийно завершает процесс

text:
# abort(3)

## ИМЯ
abort - аварийно завершает процесс

## ОБЗОР

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

```
void abort(void);
```

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

Если сигнал SIGABRT игнорируется или обрабатывается обработчиком, который возвращает управление, то функция abort() всё равно завершит процесс. Она восстанавливает обработчик SIGABRT по умолчанию, а затем генерирует сигнал повторно.

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

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

Интерфейс

Атрибут

Значение

abort()

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

MT-Safe

## ЗАМЕЧАНИЯ
Вплоть до glibc 2.26, если функция abort() вызывала завершение процесса, то все открытые потоки закрывались и сбрасывались на диск (как при fclose(3)). Однако, в некоторых случаях это могло приводить к взаимным блокировкам и повреждению данных. Поэтому, начиная с glibc 2.27, abort() завершает процесс не сбрасывая потоки на диск. В POSIX.1 разрешено и такое поведение, там указано, что abort() «может выполнить попытку отработать как fclose() на все открытые потоки».

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

## СМОТРИТЕ ТАКЖЕ
gdb(1), sigaction(2), assert(3), exit(3), longjmp(3), raise(3)


abs

title: abs(3)

text:
# abs(3)

## ИМЯ
abs, labs, llabs, imaxabs - вычисление абсолютного значения целого числа

## ОБЗОР

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

```
int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);
#include <inttypes.h>
```

```
intmax_t imaxabs(intmax_t j);
```

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

llabs():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функция abs() вычисляет абсолютное значение целого аргумента j. Функции labs(), llabs() и imaxabs() вычисляют абсолютное значение аргумента j соответствующего типа целого.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращают абсолютное значение целого аргумента в соответствующем типе целого.

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

Интерфейс

Атрибут

Значение

abs(), labs(), llabs(), imaxabs()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD. В C89 включены только функции abs() и labs; функции llabs() и imaxabs() были добавлены в C99.

## ЗАМЕЧАНИЯ
Абсолютное значение минимального отрицательного целого не определено.

Функция llabs() включена в glibc начиная с версии 2.0. Функция imaxabs() включена в glibc начиная с версии 2.1.1.

Чтобы объявить llabs(), необходимо определить _ISOC99_SOURCE или _ISOC9X_SOURCE (в зависимости от версии glibc) до включения любых стандартных заголовочных файлов.

По умолчанию, GCC обращается с abs(), labs() и (начиная с GCC 3.0) llabs() и imaxabs() как со встроенными функциями.

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


acos

title: acos(3)

summary: функция вычисления арккосинуса

text:
# acos(3)

## ИМЯ
acos, acosf, acosl - функция вычисления арккосинуса

## ОБЗОР

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

```
double acos(double x);
float acosf(float x);
long double acosl(long double x);
```

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

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

acosf(), acosl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха эти функции возвращают арккосинус от x в радианах; результат находится в диапазоне значений [0, pi].

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

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

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

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

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

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

Ошибка области: x находится вне диапазона [-1, 1]

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

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

Интерфейс

Атрибут

Значение

acos(), acosf(), acosl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
asin(3), atan(3), atan2(3), cacos(3), cos(3), sin(3), tan(3)


acosh

title: acosh(3)

text:
# acosh(3)

## ИМЯ
acosh, acoshf, acoshl - функция вычисления обратного гиперболического косинуса

## ОБЗОР

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

```
double acosh(double x);
float acoshf(float x);
long double acoshl(long double x);
```

```

```

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

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

acosh():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

acoshf(), acoshl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

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

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

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

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

Ошибка области: x меньше 1

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

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

Интерфейс

Атрибут

Значение

acosh(), acoshf(), acoshl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
asinh(3), atanh(3), cacosh(3), cosh(3), sinh(3), tanh(3)


addseverity

title: addseverity(3)

summary: объявление новых классов критичности

text:
# addseverity(3)

## ИМЯ
addseverity - объявление новых классов критичности

## ОБЗОР

```
#include <fmtmsg.h>
```

```
int addseverity(int severity, const char *s);
```

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

addseverity():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_SVID_SOURCE

## ОПИСАНИЕ
Эта функция позволяет добавить новые классы критичности (severity), которые могут передаваться в аргументе severity функции fmtmsg(3). По умолчанию, эта функция позволяет выводить сообщения с уровнями критичности 0-4 (со строками (и без), HALT, ERROR, WARNING, INFO). Описываемая здесь функция связывает указанную строку s с заданным значением критичности severity. Если значение s равно NULL, то класс критичности с числовым значением severity будет удалён. Невозможно изменить или удалить классы критичности по умолчанию. Значение критичности должно быть положительным.

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

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

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

Интерфейс

Атрибут

Значение

addseverity()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция не определена в X/Open Portability Guide, хотя в нём есть функция fmtmsg(3). Она доступна в системах System V.

## ЗАМЕЧАНИЯ
Также, новые классы критичности можно добавить создав переменную окружения SEV_LEVEL.

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


adjtime

title: adjtime(3)

text:
# adjtime(3)

## ИМЯ
adjtime - корректировка времени для синхронизации с системными часами

## ОБЗОР

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

```
int adjtime(const struct timeval *delta, struct timeval *olddelta);
```

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

adjtime():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE

## ОПИСАНИЕ
Функция adjtime() постепенно подстраивает системные часы (значение которых можно получить функцией gettimeofday(2)). Количество времени, на которое будут подстроены часы, указано в структуре, на которую указывает delta. Данная структура имеет следующий формат:

```
struct timeval {

    time_t      tv_sec;     /* секунды */

    suseconds_t tv_usec;    /* микросекунды */
};
```

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

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

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

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

## ОШИБКИ
EINVAL

Подстройка в delta находится вне разрешённого диапазона.

EPERM

Вызывающий не обладает нужными привилегиями для подстройки времени. В Linux для этого требуется мандат CAP_SYS_TIME.

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

Интерфейс

Атрибут

Значение

adjtime()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Подстройка adjtime() заставляет часы постоянно ускорять свой ход. Использование adjtime() для подстройки времени предотвращает проблемы, которые могут возникнуть у некоторых программ (например, make(1)), если происходят скачки времени вперед или назад.

Функция adjtime() предназначена для использования подстроек системных часов малыми значениями. В большинстве систем есть ограничение для времени подстройки, которое можно указывать в delta. В реализации glibc значение delta должно быть меньше либо равно (INT_MAX / 1000000 - 2) и больше либо равно (INT_MIN / 1000000 + 2) (для i386 эти значения равны -2145 и 2145 секунд, соответственно).

## ДЕФЕКТЫ
Была застарелая ошибка, при который если delta была определена как NULL, то информация по предыдущей подстройке в olddelta не возвращалась (в данном случае adjtime() должна возвращать последнюю подстройку часов без изменений). Эта ошибка была исправлена в системах с glibc 2.8 и выше и ядром Linux 2.6.26 и выше.

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


title: aio_cancel(3)

summary: отменяет ожидающий асинхронный запрос ввода\-вывода

text:
# aio_cancel(3)

## ИМЯ
io_cancel - отменяет ожидающий асинхронный запрос ввода-вывода

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

int aio_cancel(int fd, struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_cancel() пытается отменить ожидающие асинхронные запросы ввода-вывода для файлового дескриптора fd. Если значение aiocbp равно NULL, то отменяются все запросы. В противном случае, отменяется только запрос, описанный в управляющем блоке, на который указывает значение aiocbp (описание структуры aiocb смотрите в aio(7)).

При отмене запроса посылаются обычные асинхронные уведомления (смотрите aio(7) и sigevent(7)). Запрос возвращает состояние (aio_return(3)) равное -1, а состояние ошибки (aio_error(3)) устанавливается в ECANCELED. Управляющие блоки запросов, которые не могут быть отменены, не изменяются.

Если запрос не может быть отменён, то он завершается как обычно после выполнения операции ввода-вывода (в этом случае aio_error(3) вернёт состояние EINPROGRESSS).

В случае, если значение aiocbp не равно NULL и fd отличается от файлового дескриптора, для которого создавалась асинхронная операция, то поведение непредсказуемо.

Список операций, которые можно отменять, зависит от реализации.

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

AIO_CANCELED

Все запросы успешно отменены.

AIO_NOTCANCELED

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

AIO_ALLDONE

Все запросы выполнены ещё до вызова.

-1

Произошла ошибка. Значение ошибки можно узнать из errno.

## ОШИБКИ
EBADF

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

ENOSYS

Функция aio_cancel() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_cancel()

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

MT-Safe

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

## ПРИМЕР
Смотрите aio(7).

## СМОТРИТЕ ТАКЖЕ
aio_error(3), aio_fsync(3), aio_read(3), aio_return(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7)


title: aio_error(3)

text:
# aio_error(3)

## ИМЯ
aio_error - возвращает состояние ошибки операции асинхронного ввода/вывода

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

int aio_error(const struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_error() возвращает состояние ошибки запроса асинхронного ввода-вывода для указанного блока управления aiocbp (описание структуры aiocb смотрите в aio(7)).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция возвращает одно из следующих значений:

- EINPROGRESS, если запрос ещё не выполнен.

- ECANCELED, если запрос отменён.

- 0, если запрос выполнен без ошибок.

- Если асинхронная операция ввода-вывода завершилась с ошибкой, то возвращается положительное число. Это тоже значение, которое сохраняется в переменной errno при синхронном вызове read(2), write(2), fsync(2) или fdatasync(2).

## ОШИБКИ
EINVAL

Значение aiocbp не указывает на блок управления запросом асинхронного ввода-вывода, значение результата которого ещё не получено (смотрите aio_return(3)).

ENOSYS

Функция aio_error() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_error()

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

MT-Safe

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

## ПРИМЕР
Смотрите aio(7).

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_fsync(3), aio_read(3), aio_return(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7)


title: aio_fsync(3)

summary: асинхронная файловая синхронизация

text:
# aio_fsync(3)

## ИМЯ
aio_fsync - асинхронная файловая синхронизация

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

int aio_fsync(int op, struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_fsync() выполняет синхронизацию всех ожидающих выполнения асинхронных операций ввода-вывода, связанных с aiocbp->aio_fildes (описание структуры aiocb смотрите в aio(7)).

Более точно, если значение op равно O_SYNC, то все операции ввода-вывода в очереди будут выполнены, как если бы сработал вызов fsync(2), а если op равно O_DSYNC, то данная функция является асинхронным аналогом fdatasync(2).

Заметим, что это только запрос; функция не ожидает завершения выполнения ввода-вывода.

Кроме aio_fildes, в структуре aiocbp используется только поле aio_sigevent (структура sigevent описана в sigevent(7)), в котором указывается желаемый тип асинхронного уведомления по завершению. Все остальные поля игнорируются.

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

## ОШИБКИ
EAGAIN

Не хватает ресурсов.

EBADF

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

EINVAL

Синхронизированный ввод-вывод не поддерживается для этого файла, или значение op не равно O_SYNC или O_DSYNC.

ENOSYS

Функция aio_fsync() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_fsync()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_read(3), aio_return(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7), sigevent(7)


title: aio_init(3)

summary: инициализирует асинхронный ввод\-вывод

text:
# aio_init(3)

## ИМЯ
aio_init - инициализирует асинхронный ввод-вывод

## ОБЗОР

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

```
void aio_init(const struct aioinit *init);
```

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

## ОПИСАНИЕ
Имеющаяся только в GNU функция aio_init() позволяет вызывающему указать подстроечные подсказки реализации glibc POSIX AIO. Использовать данную функцию необязательно, но для эффективности её нужно вызвать перед вызовом какой-либо функции программного интерфейса POSIX AIO.

Подстроечная информация передаётся в буфере, на который указывает параметр init. Данный буфер представляет собой следующую структуру:

```
struct aioinit {

    int aio_threads;    /* максимальное количество нитей */

    int aio_num;        /* количество ожидаемых одновременных

                           запросов */

    int aio_locks;      /* не используется */

    int aio_usedba;     /* не используется */

    int aio_debug;      /* не используется */

    int aio_numusers;   /* не используется */

    int aio_idle_time;  /* количество секунд перед завершением

                           незанятой нити (начиная с glibc 2.2) */

    int aio_reserved;
};
```

В структуре aioinit используются следующие поля:

aio_threads

В этом поле задаётся максимальное количество обрабатывающих (worker) нитей, которые могут использоваться в реализации. Если количество ожидающих операций ввода-вывода превышает это значение, то лишние операции будут в очереди до тех пор, пока не освободится обрабатывающая нить. Если значение поля меньше 1, то используется значение 1. Значение по умолчанию равно 20.

aio_num

В этом поле задаётся максимальное количество одновременных запросов ввода-вывода, которое вызывающий хочет видеть в очереди. Если значение поля меньше 32, то оно округляется до 32. Значение по умолчанию равно 64.

aio_idle_time

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

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

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

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


title: aio_read(3)

summary: асинхронное чтение

text:
# aio_read(3)

## ИМЯ
aio_read - асинхронное чтение

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

int aio_read(struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_read() ставит в очередь запрос ввода-вывода, описанный в буфере, на который указывает aiocbp. Эта функция является асинхронным аналогом вызова read(2). Аргументы функции

read(fd, buf, count)

соответствуют (в указанном порядке) полям aio_fildes, aio_buf и aio_nbytes структуры, на которую указывает aiocbp (описание структуры aiocb смотрите в aio(7)).

Чтение данных выполняется начиная с абсолютного положения в файле aiocbp->aio_offset, независимо от смещения в файле. После вызова значение смещения в файле не определено.

Прилагательное «асинхронный» означает, что вызов возвращает управление сразу после установки запроса в очередь; при завершении вызова чтение может уже выполнится, а может и нет. Для проверки выполнения чтения используйте aio_error(3). Состояние возврата завершённой операции ввода-вывода можно получить с помощью aio_return(3). Асинхронное уведомление о выполнении ввода-вывода можно получить, установив aiocbp->aio_sigevent соответствующим образом; подробней смотрите в sigevent(7).

Если определён макрос _POSIX_PRIORITIZED_IO и данный файл его поддерживает, асинхронная операция устанавливается в очередь с приоритетом вызывающего процесса минус aiocbp->aio_reqprio.

Поле aiocbp->aio_lio_opcode игнорируется.

Данные не читаются из обычного файла, если смещение превышает максимум.

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

## ОШИБКИ
EAGAIN

Не хватает ресурсов.

EBADF

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

EINVAL

Одно или несколько значений у aio_offset, aio_reqprio или aio_nbytes неверны.

ENOSYS

Функция aio_read() не реализована.

EOVERFLOW

Файл является обычным файлом, мы начинаем читать его до конца файла и хотим получить не менее одного байта, но начальная позиция находится за максимальным значением смещения этого файла.

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

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

Интерфейс

Атрибут

Значение

aio_read()

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

MT-Safe

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

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

Одновременное выполнение операций ввода-вывода через совместно используемую структуру aiocb приводит к непредсказуемым результатам.

## ПРИМЕР
Смотрите aio(7).

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_fsync(3), aio_return(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7)


title: aio_return(3)

summary: возвращает состояние операции асинхронного ввода\-вывода

text:
# aio_return(3)

## ИМЯ
aio_return - возвращает состояние операции асинхронного ввода-вывода

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

ssize_t aio_return(struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_return() возвращает окончательное значение завершения запроса асинхронного ввода-вывода, задаваемого указателем на контрольный блок aiocbp (описание структуры aiocb смотрите в aio(7)).

Эта функция должна вызываться единожды для любого запроса в случае, если aio_error(3) возвращает результат, отличный от EINPROGRESS.

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

Если асинхронная операция ввода-вывода ещё не выполнена, то возвращаемое значение и действие aio_return() не определены.

## ОШИБКИ
EINVAL

aiocbp не указывает на контрольный блок запроса асинхронного ввода-вывода, значение результата которого ещё не получено.

ENOSYS

Функция aio_return() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_return()

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

MT-Safe

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

## ПРИМЕР
Смотрите aio(7).

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_fsync(3), aio_read(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7)


title: aio_suspend(3)

summary: ожидает завершения операции ввода\-вывода или истечения срока

text:
# aio_suspend(3)

## ИМЯ
aio_suspend - ожидает завершения операции ввода-вывода или истечения срока

## ОБЗОР

```
#include <aio.h>
```

```
int aio_suspend(const struct aiocb * const aiocb_list[],
                int nitems, const struct timespec *timeout);
```

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

## ОПИСАНИЕ
Функция aio_suspend() приостанавливает выполнение вызывающей нити до тех пор, пока не случиться одно из следующих событий:

- Завершится один или более асинхронных запросов ввода-вывода из списка aiocb_list.

- Будет получен сигнал.

- Если значение timeout не NULL и истечёт указанный срок (описание структуры timespec смотрите в nanosleep(2)).

В аргументе nitems задаётся количество элементов в aiocb_list. Каждый элемент в списке, который задаётся в aiocb_list, должен быть равен NULL (игнорируется), или указывать на управляющий блок, который создаётся при создании операции ввода-вывода с помощью aio_read(3), aio_write(3) или lio_listio(3) (описание структуры aiocb смотрите в aio(7)).

Если поддерживается CLOCK_MONOTONIC, то данный таймер используется для измерения периода ожидания (смотрите clock_gettime(3)).

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

## ОШИБКИ
EAGAIN

Истёк период ожидания в вызове до завершения какой-либо операции.

EINTR

Вызов завершён по сигналу (возможно по сигналу, который ожидался как завершение операции); смотрите signal(7).

ENOSYS

Функция aio_suspend() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_suspend()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Можно выполнить опрос с не NULL значением timeout, указав нулевой временной интервал.

Если одна или несколько асинхронных операций ввода-вывода, указанных в aiocb_list, уже завершилась на момент вызова aio_suspend(), то вызов сразу завершает работу.

Чтобы после успешного возврата из aio_suspend() определить, какие операции ввода-вывода завершились, используйте aio_error(3) для проверки списка структур aiocb, на который указывает aiocb_list.

## ДЕФЕКТЫ
Реализация aio_suspend() в glibc не является безопасной для асинхронных сигналов, что нарушает требования POSIX.1.

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_fsync(3), aio_read(3), aio_return(3), aio_write(3), lio_listio(3), aio(7), time(7)


title: aio_write(3)

summary: асинхронная запись

text:
# aio_write(3)

## ИМЯ
aio_write - асинхронная запись

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

int aio_write(struct aiocb *aiocbp);

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

## ОПИСАНИЕ
Функция aio_write() ставит в очередь запрос ввода-вывода, описанный в буфере, на который указывает aiocbp. Эта функция является асинхронным аналогом вызова write(2). Аргументы функции

write(fd, buf, count)

соответствуют (в указанном порядке) полям aio_fildes, aio_buf и aio_nbytes структуры, на которую указывает aiocbp (описание структуры aiocb смотрите в aio(7)).

Если флаг O_APPEND не установлен, то данные записываются начиная от абсолютного положения в файле aiocbp->aio_offset, независимо от смещения в файле. Если флаг O_APPEND установлен, то данные записываются в конец файла в том порядке, в котором запускались вызовы aio_write(). После вызова значение смещения файла не определено.

Прилагательное «асинхронный» означает, что вызов возвращает управление сразу после установки запроса в очередь; при завершении вызова запись может уже выполнится, а может и нет. Для проверки выполнения чтения используйте aio_error(3). Состояние возврата завершённой операции ввода-вывода можно получить с помощью aio_return(3). Асинхронное уведомление о выполнении ввода-вывода можно получить, установив aiocbp->aio_sigevent соответствующим образом; подробней смотрите в sigevent(7).

Если определён макрос _POSIX_PRIORITIZED_IO и данный файл его поддерживает, асинхронная операция устанавливается в очередь с приоритетом вызывающего процесса минус aiocbp->aio_reqprio.

Поле aiocbp->aio_lio_opcode игнорируется.

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

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

## ОШИБКИ
EAGAIN

Не хватает ресурсов.

EBADF

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

EFBIG

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

EINVAL

Одно или несколько значений у aio_offset, aio_reqprio или aio_nbytes, неверны.

ENOSYS

Функция aio_write() не реализована.

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

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

Интерфейс

Атрибут

Значение

aio_write()

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

MT-Safe

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

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

Одновременное выполнение операций ввода-вывода через совместно используемую структуру aiocb приводит к непредсказуемым результатам.

## СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_fsync(3), aio_read(3), aio_return(3), aio_suspend(3), lio_listio(3), aio(7)


alloca

title: alloca(3)

text:
# alloca(3)

## ИМЯ
alloca - выделяет память, которая будет высвобождена автоматически

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

void *alloca(size_t size);

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

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

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

Интерфейс

Атрибут

Значение

alloca()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данная функция отсутствует в POSIX.1.

Очевидно, что данная функция alloca() существует в 32V, PWB, PWB.2, 3BSD и 4BSD. Это можно понять по наличию соответствующей справочной страницы в 4.3BSD. В Linux используется версия GNU.

## ЗАМЕЧАНИЯ
Работа функции alloca() зависит от машины и компилятора. В некоторых приложениях её использование может повысить эффективность (если сравнивать с malloc(3) плюс free(3)). В определённых случаях она также может упростить высвобождение памяти в приложениях, использующих longjmp(3) или siglongjmp(3). Но лучше её не использовать.

Так как пространство, выделяемое alloca(), берётся из стекового кадра, то оно автоматически освобождается, когда возврат из функции производится вызовом longjmp(3) или siglongjmp(3).

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

Не пытайтесь освободить место, выделенное alloca(), с помощью free(3)!

### Замечания для версии GNU
Обычно, gcc(1) встраивает код alloca() в место вызова. Это не делается, если был указан параметр -ansi, -std=c89, -std=c99 или -std=c11 и заголовочный файл <alloca.h> не включается. В противном случае (без параметра -ansi или -std=c*) версия glibc файла <stdlib.h> включает <alloca.h>, который содержит строки:

```
#ifdef  __GNUC__
#define alloca(size)   __builtin_alloca (size)
#endif
```

что приводит к множеству неприятных последствий, если у кого-то есть своя версия этой функции.

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

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

## ДЕФЕКТЫ
Если стековый кадр не может быть расширен, то никакой ошибки также не возвращается (однако, после неудачного выделения программа, вероятно, получит сигнал SIGSEGV при попытке доступа к не выделенному пространству).

Во многих системах alloca() не может быть использована в списке аргументов вызова функции, так как пространство под стек, зарезервированное alloca(), возникло бы между аргументами функции.

## СМОТРИТЕ ТАКЖЕ
brk(2), longjmp(3), malloc(3)


title: argz_add(3)

summary: функции для обработки списка argz

text:
# argz_add(3)

## ИМЯ
argz_add, argz_add_sep, argz_append, argz_count, argz_create, argz_create_sep, argz_delete, argz_extract, argz_insert, argz_next, argz_replace, argz_stringify - функции для обработки списка argz

## ОБЗОР

```
#include <argz.h>
```

```
error_t argz_add(char **argz, size_t *argz_len, const char *str);
```

```
error_t argz_add_sep(char **argz, size_t *argz_len,
                     const char *str, int delim);
```

```
error_t argz_append(char **argz, size_t *argz_len,
                     const char *buf, size_t buf_len);
```

```
size_t argz_count(const char *argz, size_t argz_len);
```

```
error_t argz_create(char * const argv[], char **argz,
                     size_t *argz_len);
```

```
error_t argz_create_sep(const char *str, int sep, char **argz,
                     size_t *argz_len);
```

```
void argz_delete(char **argz, size_t *argz_len, char *entry);
```

```
void argz_extract(const char *argz, size_t argz_len, char  **argv);
```

```
error_t argz_insert(char **argz, size_t *argz_len, char *before,
                     const char *entry);
```

```
char *argz_next(const char *argz, size_t argz_len, const char *entry);
```

```
error_t argz_replace(char **argz, size_t *argz_len, const char *str,
                     const char *with, unsigned int *replace_count);
```

```
void argz_stringify(char *argz, size_t len, int sep);
```

## ОПИСАНИЕ
Эти функции есть только в glibc.

Вектор argz представляет собой указатель на символьный буфер и его длину. Данный символьный буфер следует считать массивом строк, разделённых байтами null ('\0'). Если длина ненулевая, то последний байт в буфере должен быть null.

Эти функции предназначены для обработки векторов argz. Пара (null,0) представляет вектор argz и наоборот, векторы argz длиной 0 должны иметь указатель null. Размещение непустых векторов argz осуществляется функцией malloc(3), а для высвобождения пространства можно использовать free(3).

Функция argz_add() добавляет строку str в конец массива *argz, и обновляет *argz и *argz_len.

Функция argz_add_sep() делает тоже самое, но разделяет строку str на подстроки, разделяя их символом delim. Например, это можно использовать при работе с путями поиска UNIX, где разделителем является ':'.

Функция argz_append() добавляет вектор argz (buf, buf_len) после (*argz, *argz_len) и обновляет *argz и *argz_len (таким образом, *argz_len будет увеличено на buf_len).

Функция argz_count() подсчитывает количество строк, то есть количество байтов null в ('\0'), в (argz, argz_len).

Функция argz_create() преобразует аргумент вектора argv в стиле UNIX, заканчивающийся (char *) 0, в вектор argz (*argz, *argz_len).

Функция argz_create_sep() преобразует строку str, заканчивающуюся null, в вектор argz (*argz, *argz_len), разделяя её при каждом нахождении разделителя sep.

Функция argz_delete() удаляет подстроку, на которую указывает entry, из вектора argz (*argz, *argz_len) и обновляет *argz и *argz_len.

Функция argz_extract() является противоположностью argz_create(). Она берёт вектор argz (argz, argz_len) и заполняет массив, начиная с argv, указателями на подстроки и завершая его NULL, тем самым создавая вектор argv в стиле UNIX. Массив argv должен иметь пространство для argz_count(argz, argz_len) + 1 указателей.

Функция argz_insert() является противоположностью argz_delete(). Она вставляет аргумент entry с позиции before в вектор (*argz, *argz_len) и обновляет *argz и *argz_len. Если значение before равно NULL, то значение entry будет вставлено в конец.

Функция argz_next() предназначена для последовательного обхода вектора argz. Если значение entry равно NULL, то возвращается первый элемент. Иначе возвращается следующий элемент. Если следующего элемента нет, то возвращается NULL.

Функция argz_replace() заменяет каждую найденную строку str на with, изменяя размер argz при необходимости. Если значение replace_count не равно NULL, то значение *replace_count будет увеличено на число замен.

Функция argz_stringify() является противоположностью argz_create_sep(). Она преобразует вектор argz в обычную строку, заменяя все байты null ('\0'), за исключением последнего, значением sep.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Все функции argz, в которых происходит выделение памяти, возвращают результат, имеющий тип error_t: 0 — при успешном выполнении и ENOMEM — при ошибке выделения памяти.

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

Интерфейс

Атрибут

Значение

argz_add(), argz_add_sep(), argz_append(), argz_count(), argz_create(), argz_create_sep(), argz_delete(), argz_extract(), argz_insert(), argz_next(), argz_replace(), argz_stringify()

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

MT-Safe

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

## ДЕФЕКТЫ
Векторы argz без завершающего байта null могут привести к ошибкам сегментирования.

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


asin

title: asin(3)

summary: функция вычисления арксинуса

text:
# asin(3)

## ИМЯ
asin, asinf, asinl - функция вычисления арксинуса

## ОБЗОР

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

```
double asin(double x);
float asinf(float x);
long double asinl(long double x);
```

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

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

asinf(), asinl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции вычисляют арксинус от x; это значение, синус которого равен x.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха эти функции возвращают арксинус от x в радианах; результат лежит в диапазоне значений [-pi/2, pi/2].

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

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

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

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

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

Ошибка области: x находится вне диапазона [-1, 1]

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

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

Интерфейс

Атрибут

Значение

asin(), asinf(), asinl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
acos(3), atan(3), atan2(3), casin(3), cos(3), sin(3), tan(3)


asinh

title: asinh(3)

text:
# asinh(3)

## ИМЯ
asinh, asinhf, asinhl - функция вычисления гиперболического арксинуса

## ОБЗОР

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

```
double asinh(double x);
float asinhf(float x);
long double asinhl(long double x);
```

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

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

asinh():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

asinhf(), asinhl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

asinh(), asinhf(), asinhl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
acosh(3), atanh(3), casinh(3), cosh(3), sinh(3), tanh(3)


asprintf

title: asprintf(3)

text:
# asprintf(3)

## ИМЯ
asprintf, vasprintf - выводит данные в строку, выделенную в памяти

## ОБЗОР
\#define _GNU_SOURCE /* смотрите feature_test_macros(7) */

\#include <stdio.h>

int asprintf(char **strp, const char *fmt, ...);

int vasprintf(char **strp, const char *fmt, va_list ap);

## ОПИСАНИЕ
Функции asprintf и vasprintf являются аналогами sprintf(3) и vsprintf(3), отличаясь только тем, что они выделяют в памяти строку, достаточную для размещения результата, включая конечный байт null ('\0'), и возвращают указатель на эту строку через первый аргумент. Для высвобождения выделенной памяти указатель должен быть передан функции free(3).

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

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

Интерфейс

Атрибут

Значение

asprintf(), vasprintf()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU, они отсутствуют в C и POSIX. Также они доступны в *BSD. В FreeBSD при ошибке strp присваивается значение NULL.

## СМОТРИТЕ ТАКЖЕ
free(3), malloc(3), printf(3)


assert

title: assert(3)

text:
# assert(3)

## ИМЯ
assert - прекращает работу программы при ложном утверждении

## ОБЗОР

```
#include <assert.h>
```

```
void assert(scalar expression);
```

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

Если expression ложно (т. е., при сравнении равно нулю), то assert() печатает сообщение об ошибке в стандартный поток ошибок и завершает программу вызовом abort(3). Сообщение об ошибке содержит имя файла и функцию, содержащую вызов assert(), номер строки исходного кода вызова и текст аргумента; пример:

prog: some_file.c:16: some_func: Assertion `val == 0' failed.

Если определён макрос NDEBUG на момент включения последнего <assert.h>, то макрос assert() не генерирует код, и, следовательно ничего вызывает. Не рекомендуется определять NDEBUG, если assert() используется для обнаружения ошибок условий, так как ПО может повести себя непредсказуемо.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Ничего не возвращается.

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

Интерфейс

Атрибут

Значение

assert()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99. В стандарте C89 указано, что значение expression должно иметь тип int, и поведение функции непредсказуемо, если это не так; согласно стандарту C99, переменная может быть любого скалярного типа.

## ДЕФЕКТЫ
Функция assert() реализована в виде макроса. Если проверка выражения приводит к побочным изменениям, то поведение программы будет различным в зависимости от наличия NDEBUG. Это может создавать гейзенбаг, который исчезает при включении отладки.

## СМОТРИТЕ ТАКЖЕ
abort(3), assert_perror(3), exit(3)


title: assert_perror(3)

text:
# assert_perror(3)

## ИМЯ
assert_perror - проверяет errnum и прекращает выполнение программы

## ОБЗОР

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

```
void assert_perror(int errnum);
```

## ОПИСАНИЕ
Если на момент последнего включения <assert.h> был определён макрос NDEBUG, то для макроса assert_perror() не создаётся никакого кода и, соответственно, он вообще ничего не делает. В противном случае, макрос assert_perror() выводит в стандартный поток ошибок сообщение об ошибке и прекращает работу программы вызовом abort(3), если значение errnum не равно нулю. В сообщении содержится имя файла, имя функции и номер строки вызова макроса, а также результат вызова strerror(errnum).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Ничего не возвращается.

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

Интерфейс

Атрибут

Значение

assert_perror()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Это расширение GNU.

## ДЕФЕКТЫ
Целью макроса assert является оказание помощи программистам в поиске ошибок в программах — таких сбоев, которые не могут случиться, если только не была допущена ошибка в коде программы. Однако, с системными или библиотечными вызовами ситуация немного отличается, и возврат ошибки может произойти и, собственно, произойдёт и должен может быть проверен, но не через assert, где проверка не получится, если определено NDEBUG, а правильным кодом обработки ошибок. Никогда не используйте этот макрос.

## СМОТРИТЕ ТАКЖЕ
abort(3), assert(3), exit(3), strerror(3)


atan

title: atan(3)

summary: функция вычисления арктангенса

text:
# atan(3)

## ИМЯ
atan, atanf, atanl - функция вычисления арктангенса

## ОБЗОР

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

```
double atan(double x);
float atanf(float x);
long double atanl( long double x);
```

```

```

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

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

atanf(), atanl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции вычисляют арктангенс от x; это значение, тангенс которого равен x.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха эти функции возвращают значение арктангенса от x в радианах; результат лежит в диапазоне значений [-pi/2, pi/2].

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

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

Если x стремится к плюс бесконечности (минус бесконечности), то будет возвращен +pi/2 (-pi/2).

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

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

Интерфейс

Атрибут

Значение

atan(), atanf(), atanl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
acos(3), asin(3), atan2(3), carg(3), catan(3), cos(3), sin(3), tan(3)


title: atan2(3)

text:
# atan2(3)

## ИМЯ
atan2, atan2f, atan2l - функция вычисления арктангенcа двух переменных

## ОБЗОР

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

```
double atan2(double y, double x);
float atan2f(float y, float x);
long double atan2l(long double y, long double x);
```

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

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

atan2f(), atan2l():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении данные функции возвращают значение арктангенса y/x в радианах; возвращаемое значение находится в диапазоне [-pi, pi].

Если y равно +0 (-0) и x меньше 0, то возвращается +pi (-pi).

Если y равно +0 (-0) и x больше 0, то возвращается +0 (-0).

Если y меньше 0 и и x равно +0 или -0, то возвращается -pi/2.

Если y больше 0 и и x равно +0 или -0, то возвращается pi/2.

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

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

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

Если y — конечное значение большее (меньшее) 0 и x стремится к минус бесконечности, то возвращается +pi (-pi).

Если y — конечное значение большее (меньшее) 0 и x стремится к плюс бесконечности, то возвращается +0 (-0).

Если y стремится к плюс бесконечности (минус бесконечности) и x имеет конечное значение, то будет возвращено pi/2 (-pi/2).

Если y стремится к плюс бесконечности (минус бесконечности) и x стремится к минус бесконечности, то будет возвращено +3*pi/4 (-3*pi/4).

Если y стремится к плюс бесконечности (минус бесконечности) и x стремится к плюс бесконечности, то будет возвращено +pi/4 (-pi/4).

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

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

Интерфейс

Атрибут

Значение

atan2(), atan2f(), atan2l()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
acos(3), asin(3), atan(3), carg(3), cos(3), sin(3), tan(3)


atanh

title: atanh(3)

text:
# atanh(3)

## ИМЯ
atanh, atanhf, atanhl - вычисление функции обратного гиперболического тангенса

## ОБЗОР

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

```
double atanh(double x);
float atanhf(float x);
long double atanhl(long double x);
```

```

```

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

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

atanh():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

atanhf(), atanhl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

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

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

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

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

Ошибка области: x меньше -1 или больше +1

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

Ошибка особой точки: x равно +1 или -1

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

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

Интерфейс

Атрибут

Значение

atanh(), atanhf(), atanhl()

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

MT-Safe

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

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

## ДЕФЕКТЫ
В glibc 2.9 и ранее при возникновении ошибки особой точки, значению errno присваивается EDOM вместо ERANGE согласно POSIX. Начиная с версии 2.10, в glibc это исправлено.

## СМОТРИТЕ ТАКЖЕ
acosh(3), asinh(3), catanh(3), cosh(3), sinh(3), tanh(3)


atexit

title: atexit(3)

text:
# atexit(3)

## ИМЯ
atexit - регистрирует функцию, вызываемую при обычном завершении программы

## ОБЗОР

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

```
int atexit(void (*function)(void));
```

## ОПИСАНИЕ
Функция atexit() регистрирует передаваемую функцию function в качестве функции, вызываемой при нормальном завершении работы программы, например, с помощью exit(3), или при завершении работы функции main. Зарегистрированные функции вызываются в порядке, обратном регистрации; никаких аргументов им не передаётся.

Одна и та же функция может быть зарегистрирована несколько раз: она вызывается один раз для каждой регистрации.

В POSIX.1 требуется, чтобы реализация позволяла регистрировать не менее ATEXIT_MAX (32) таких функций. Установленный лимит, поддерживаемый реализацией, можно определить с помощью sysconf(3).

Когда дочерний процесс создается через fork(2), он наследует копии родительских регистраций. При успешном вызове к одной из функций exec(3), все регистрации снимаются.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция atexit() при успешном выполнении возвращает 0, в противном случае — ненулевое значение.

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

Интерфейс

Атрибут

Значение

atexit()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Функции, зарегистрированные с помощью atexit() (и on_exit(3)) не вызываются, если процесс завершился некорректно, например из-за полученного сигнала.

Если одна из зарегистрированных функций вызывает _exit(2), то оставшиеся функции не вызываются, и другие шаги по завершению процесса, производимые exit(3), не выполняются.

В POSIX.1 указано, что при многократном вызове exit(3) (т. е., вызов exit(3) из функций, зарегистрированных atexit()) состояние программы не определено. В некоторых системах (не в Linux), это приводит к бесконечной рекурсии; переносимые программы не должны вызывать exit(3) из функций, зарегистрированных через atexit().

Функции atexit() и on_exit(3) регистрируют функции в едином списке: при нормальном завершении процесса зарегистрированные функции вызываются в порядке обратном регистрации с помощью данных функций.

Согласно POSIX.1 результат является не определённым, если при завершении выполнения одной из функций, зарегистрированной с помощью atexit(), используется longjmp(3).

### Замечания для Linux
Начиная с glibc 2.2.3, функция atexit() (и on_exit(3)) может быть использована в общей библиотеке для указания функций, который вызываются при выгрузке общей библиотеки.

## ПРИМЕР

```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
bye(void)
{

    printf("Но вот и всё\n");
}
int
main(void)
{

    long a;

    int i;

    a = sysconf(_SC_ATEXIT_MAX);

    printf("ATEXIT_MAX = %ld\n", a);

    i = atexit(bye);

    if (i != 0) {

        fprintf(stderr, "не удалось установить функцию при выходе\n");

        exit(EXIT_FAILURE);

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
_exit(2), dlopen(3), exit(3), on_exit(3)


atof

title: atof(3)

text:
# atof(3)

## ИМЯ
atof - преобразует строку в значение типа double

## ОБЗОР

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

```
double atof(const char *nptr);
```

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

```
strtod(nptr, NULL);
```

однако atof() не определяет ошибки.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Преобразованное значение.

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

Интерфейс

Атрибут

Значение

atof()

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

MT-Safe locale

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

## СМОТРИТЕ ТАКЖЕ
atoi(3), atol(3), strfromd(3), strtod(3), strtol(3), strtoul(3)


atoi

title: atoi(3)

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

text:
# atoi(3)

## ИМЯ
atoi, atol, atoll - преобразует строку в целое число

## ОБЗОР

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

```
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
```

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

atoll():

_ISOC99_SOURCE ||

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

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

```
strtol(nptr, NULL, 10);
```

однако atoi() не определяет ошибки.

Функции atol() и atoll() ведут себя так же, как и atoi(), за исключением того факта, что начальная часть строки приводится к типу long или long long.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Преобразованное значение.

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

Интерфейс

Атрибут

Значение

atoi(), atol(), atoll()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD. В C89 и POSIX.1-1996 содержат только функции atoi() и atol().

## ЗАМЕЧАНИЯ
В Linux libc есть atoq(), устаревшее название atoll(); atoq() отсутствует в glibc.

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


backtrace

title: backtrace(3)

summary: поддержка самоотладки в

text:
# backtrace(3)

## ИМЯ
backtrace, backtrace_symbols, backtrace_symbols_fd - поддержка самоотладки в приложении

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

int backtrace(void **buffer, int size);

char **backtrace_symbols(void *const *buffer, int size);

void backtrace_symbols_fd(void *const *buffer, int size, int fd);

## ОПИСАНИЕ
Функция backtrace() возвращает список запущенных функций вызвавшей программы в массив, на который указывает buffer. Список вызванных функций (backtrace) — это последовательность в данный момент активных вызовов функций программы. Каждый элемент в массиве, на который указывает buffer, имеет тип void * и указывает на адрес возврата из соответствующего стекового кадра (stack frame). В аргументе size задаётся максимальное количество адресов, которые могут храниться в buffer. Если список вызванных функций больше size, то возвращаются size адресов функций, вызванных последними; чтобы получить полный список вызванных функций, сделайте buffer и size достаточно большими.

Набор адресов, полученных от backtrace() через buffer, функция backtrace_symbols() транслирует в массив строк, в которых адреса представлены в символическом виде. В аргументе size передаётся количество адресов в buffer. Символический вид каждого адреса содержит имя функции (если его можно определить), шестнадцатеричное смещение в функции и реальный адрес возврата (в шестнадцатеричном виде). Результатом функции backtrace_symbols() является адрес массива указателей на строки. Этот массив выделяется backtrace_symbols() с помощью malloc(3) и должен освобождаться вызывающим (строки, на которые указывают указатели в массиве, освобождаться не должны).

Функция backtrace_symbols_fd() ожидает аргументы buffer и size как у backtrace_symbols(), но вместо записи строк в массив вызывающему, она записывает строки, одну в строке, в файловый дескриптор fd. Функция backtrace_symbols_fd() не вызывает malloc(3) и поэтому может применяться в случаях, когда вызов malloc(3) может завершаться ошибкой, но смотрите ЗАМЕЧАНИЯ.

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

При успешном выполнении backtrace_symbols() возвращает указатель на массив, выделенный malloc(3); при ошибке возвращается NULL.

## ВЕРСИИ
Функции backtrace(), backtrace_symbols() и backtrace_symbols_fd() появились в glibc начиная с версии 2.1.

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

Интерфейс

Атрибут

Значение

backtrace(), backtrace_symbols(), backtrace_symbols_fd()

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

MT-Safe

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

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

- Отсутствие указателей кадров (происходит при указании gcc(1) любого ненулевого уровня оптимизации) может вызвать нарушение этих предположений.

- Встраиваемые (inlined) функции не имеют стековых кадров.

- Оптимизация хвостовых вызовов приводит к замещению одного стекового кадра другим.

- Функция backtrace() и backtrace_symbols_fd() не вызывает malloc() явным образом, но они являются частью libgcc, которая загружается динамически при первом использовании. Обычно, динамическая загрузка вызывает malloc(3). Если вам нужно, чтобы работа с этими функциями не приводила к выделению памяти (например, в обработчиках сигналов), то перед обращением загрузите libgcc самостоятельно.

Символьные имена могут быть недоступны, если не указаны специальные параметра компоновщика. В системах с компоновщиком GNU необходимо использовать параметр -rdynamic. Заметим, что имена «статических» функций не показываются, и недоступны в списке вызовов функций.

## ПРИМЕР
Программа, представленная далее, демонстрирует использование backtrace() и backtrace_symbols(). В следующем сеансе оболочки показано, что может получиться при запуске программы:

```
$ cc -rdynamic prog.c -o prog
$ ./prog 3
backtrace() returned 8 addresses
./prog(myfunc3+0x5c) [0x80487f0]
./prog [0x8048871]
./prog(myfunc+0x21) [0x8048894]
./prog(myfunc+0x1a) [0x804888d]
./prog(myfunc+0x1a) [0x804888d]
./prog(main+0x65) [0x80488fb]
/lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]
./prog [0x8048711]
```

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

```
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BT_BUF_SIZE 100
void
myfunc3(void)
{

    int j, nptrs;

    void *buffer[BT_BUF_SIZE];

    char **strings;

    nptrs = backtrace(buffer, BT_BUF_SIZE);

    printf("backtrace() вернула %d адресов\n", nptrs);

    /* При вызове backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)

       получилось бы подобное следующему: */

    strings = backtrace_symbols(buffer, nptrs);

    if (strings == NULL) {

        perror("backtrace_symbols");

        exit(EXIT_FAILURE);

    }

    for (j = 0; j < nptrs; j++)

        printf("%s\n", strings[j]);

    free(strings);
}
static void   /* "static" означает не экспортировать символ... */
myfunc2(void)
{

    myfunc3();
}
void
myfunc(int ncalls)
{

    if (ncalls > 1)

        myfunc(ncalls - 1);

    else

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

    if (argc != 2) {

        fprintf(stderr, "%s количество-вызовов\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    myfunc(atoi(argv[1]));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
addr2line(1), gcc(1), gdb(1), ld(1), dlopen(3), malloc(3)


basename

title: basename(3)

summary: разделяет путь на компоненты

text:
# basename(3)

## ИМЯ
basename, dirname - разделяет путь на компоненты

## ОБЗОР

```
#include <libgen.h>
```

```
char *dirname(char *path);
```

```
char *basename(char *path);
```

## ОПИСАНИЕ
Предупреждение: есть две разных функции basename() — смотрите далее.

Функция dirname() и basename() разделяют строку с путём, заканчивающуюся null, на каталог и имя файла. Обычно, dirname() возвращает строку до последнего символа '/', не включая его, а basename() возвращает часть, следующую за последним символов '/'. Конечные символы '/' не считаются частью пути.

Если path не содержит косую черту, то dirname() возвращает строку «.», а basename() возвращает копию path. Если строка path равна «/», то dirname() и basename() возвращают строку «/». Если значение path равно указателю null или указывает на пустую строку, то dirname() и basename() возвращают строку «.».

Если объединить строку, возвращаемую dirname(), «/» и строку, возвращаемую basename(), то получится первоначальный путь.

Функции dirname() и basename() могут изменить содержимое path, поэтому желательно передавать копию строки при их вызове.

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

В следующих примерах (взяты из SUSv2) показаны строки, возвращаемые dirname() и basename() для различных путей:

путь

dirname

basename

/usr/lib

/usr

lib

/usr/

/

usr

usr

.

usr

/

/

/

.

.

.

..

.

..

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции dirname() и basename() возвращают указатели на строки, оканчивающиеся null (не передавайте эти указатели free(3)).

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

Интерфейс

Атрибут

Значение

basename(), dirname()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Существует две различные версии basename() — версия POSIX, описанная выше, и версия GNU, которая описана далее

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

Версия GNU никогда не изменяет свои аргументы и возвращает пустую строку, если path оканчивается символом косой черты, а в частности, если значение равно «/». Версии GNU для dirname() не существует.

Если в исходный код включён файл <libgen.h>, то из glibc используется версия basename(), описанная в POSIX, иначе — версия GNU.

## ДЕФЕКТЫ
Функции версии POSIX, реализованные в glibc, изменяют аргумент path, что приводит к ошибки сегментации при их вызове со статической строкой вида «/usr/».

До glibc 2.2.1, функция dirname() некорректно обрабатывала пути, оканчивающиеся символами '/', а также вызывало ошибку сегментирования, если указывался аргумент со значением NULL.

## ПРИМЕР
Следующий пример кода демонстрирует использование basename() и dirname():

```
char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);
```

## СМОТРИТЕ ТАКЖЕ
basename(1), dirname(1)


bcmp

title: bcmp(3)

summary: сравнивает две последовательности байт

text:
# bcmp(3)

## ИМЯ
bcmp - сравнивает две последовательности байт

## ОБЗОР

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

```
int bcmp(const void *s1, const void *s2, size_t n);
```

## ОПИСАНИЕ
Функция bcmp() сравнивает две последовательности байт s1 и s2 длиной n каждая. Если они равны или если n равно нулю, то bcmp() возвращает 0. В противном случае она возвращает ненулевой результат.

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

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

Интерфейс

Атрибут

Значение

bcmp()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.3BSD. Данная функция устарела (отмечена как УСТАРЕВШАЯ в POSIX.1-2001): в новых программах следует использовать memcmp(3). В POSIX.1-2008 спецификация bcmp() удалена.

## СМОТРИТЕ ТАКЖЕ
bstring(3), memcmp(3), strcasecmp(3), strcmp(3), strcoll(3), strncasecmp(3), strncmp(3)


bcopy

title: bcopy(3)

summary: копирует последовательность байт

text:
# bcopy(3)

## ИМЯ
bcopy - копирует последовательность байт

## ОБЗОР

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

```
void bcopy(const void *src, void *dest, size_t n);
```

## ОПИСАНИЕ
Функция bcopy() копирует n байт из src в dest. Результат будет всегда корректным, даже если обе области перекрываются.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Нет.

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

Интерфейс

Атрибут

Значение

bcopy()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.3BSD. Данная функция устарела (отмечена как УСТАРЕВШАЯ в POSIX.1-2001): в новых программах следует использовать memcpy(3) или memmove(3). Заметим, что первые два аргумента в memcpy(3) и memmove(3) поменяны местами. В POSIX.1-2008 спецификация bcopy() удалена.

## СМОТРИТЕ ТАКЖЕ
bstring(3), memccpy(3), memcpy(3), memmove(3), strcpy(3), strncpy(3)


bindresvport

title: bindresvport(3)

text:
# bindresvport(3)

## ИМЯ
bindresvport - привязывает сокет к привилегированному порту IP

## ОБЗОР

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

```
int bindresvport(int sockfd, struct sockaddr_in *sin);
```

## ОПИСАНИЕ
Функция bindresvport() используется для привязки сокета, на который указывает файловый дескриптор sockfd, к привилегированному анонимному порту IP, то есть произвольно выбранному порту с номером из диапазона от 512 до 1023.

Если bind(2), вызываемый из bindresvport(), выполнен без ошибок, и значение sin не равно NULL, то в sin->sin_port возвращается выделенный номер порта.

Значение sin может быть NULL; в этом случае sin->sin_family неявно присваивается значение AF_INET. Однако в этом случае bindresvport() не возвращает номер порта, который был в действительности выделен (эта информация может быть получена позже с помощью getsockname(2)).

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

## ОШИБКИ
Функция bindresvport() может завершиться с ошибкой по тем же причинам что и bind(2). Также могут возникать следующие ошибки:

EACCES

Вызывающий процесс не имеет прав (в Linux: вызывающий процесс не имеет мандата CAP_NET_BIND_SERVICE в пользовательском пространстве, управляющим своим сетевым пространством имён).

EADDRINUSE

Все привилегированные порты заняты.

EAFNOSUPPORT (EPFNOSUPPORT в glibc 2.7 и старше)

Значение sin не равно NULL и sin->sin_family не равно AF_INET.

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

Интерфейс

Атрибут

Значение

bindresvport()

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

. glibc >= 2.17: MT-Safe glibc < 2.17: MT-Unsafe

До glibc 2.17 в функции bindresvport() используется статическая незащищённая блокировкой переменная, поэтому функцию нельзя использовать в нескольких нитях одновременно.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Нет в POSIX.1. Присутствует в BSD, Solaris и многих других системах.

## ЗАМЕЧАНИЯ
В отличие от других реализаций bindresvport(), версия glibc игнорирует любые значения, которые передал вызывающий в sin->sin_port.

## СМОТРИТЕ ТАКЖЕ
bind(2), getsockname(2)


title: bsd_signal(3)

text:
# bsd_signal(3)

## ИМЯ
bsd_signal - обрабатывает сигналы согласно семантике BSD

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

typedef void (*sighandler_t)(int);

sighandler_t bsd_signal(int signum, sighandler_t handler);

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

bsd_signal():

Начиная с glibc 2.26:

_XOPEN_SOURCE >= 500

&& ! (_POSIX_C_SOURCE >= 200809L)

glibc 2.25 и старее:

_XOPEN_SOURCE

## ОПИСАНИЕ
Функция bsd_signal() ожидает те же аргументы и выполняет ту же задачу, что и signal(2).

Различие между ними в том, что bsd_signal() гарантированно предоставляет надёжную семантику сигналов, то есть: a) обработчик сигнала не сбрасывается в значение по умолчанию, при его вызове; b) доставка последующих экземпляров сигнала блокируется до тех пор, пока выполняется обработчик сигнала; c) если обработчик сигнала прерывает блокирующий системный вызов, то системный вызов автоматически перезапускается. Переносимое приложение не может полагаться на signal(2), если ему нужны такие гарантии.

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

## ОШИБКИ
Как в signal(2).

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

Интерфейс

Атрибут

Значение

bsd_signal()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.2BSD и POSIX.1-2001. В POSIX.1-2008 спецификация bsd_signal() удалена, вместо неё рекомендуется использовать sigaction(2).

## ЗАМЕЧАНИЯ
Избегайте использования bsd_signal(), используйте вместо неё sigaction(2).

В современных Linux-системах bsd_signal() и signal(2) эквивалентны. Однако на старых системах signal(2) предоставляет ненадежную семантику сигналов. Подробности см. в signal(2).

Используемый параметр sighandler_t является расширением GNU; данный тип определён только в том случае, если определён макрос _GNU_SOURCE.

## СМОТРИТЕ ТАКЖЕ
sigaction(2), signal(2), sysv_signal(3), signal(7)


bsearch

title: bsearch(3)

text:
# bsearch(3)

## ИМЯ
bsearch - выполняет двоичный поиск в упорядоченном массиве

## ОБЗОР

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

```
void *bsearch(const void *key, const void *base,
              size_t nmemb, size_t size,
              int (*compar)(const void *, const void *));
```

## ОПИСАНИЕ
Функция bsearch() ищет в массиве размером nmemb ( base указывает на начальный элемент) элемент, который совпадает с элементом, указываемым в key. Размер каждого элемента массива задаётся в size.

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

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

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

Интерфейс

Атрибут

Значение

bsearch()

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

MT-Safe

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

## ПРИМЕР
В этом примере сначала выполняется сортировка массива структур с помощью qsort(3), а затем возвращается желаемый элемент с помощью bsearch().

```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mi {

    int nr;

    char *name;
} months[] = {

    { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },

    { 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },

    { 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
};
#define nr_of_months (sizeof(months)/sizeof(months[0]))
static int
compmi(const void *m1, const void *m2)
{

    struct mi *mi1 = (struct mi *) m1;

    struct mi *mi2 = (struct mi *) m2;

    return strcmp(mi1->name, mi2->name);
}
int
main(int argc, char **argv)
{

    int i;

    qsort(months, nr_of_months, sizeof(struct mi), compmi);

    for (i = 1; i < argc; i++) {

        struct mi key, *res;

        key.name = argv[i];

        res = bsearch(&key, months, nr_of_months,

                      sizeof(struct mi), compmi);

        if (res == NULL)

            printf("'%s': неизвестный месяц\n", argv[i]);

        else

            printf("%s: месяц #%d\n", res->name, res->nr);

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
hsearch(3), lsearch(3), qsort(3), tsearch(3)


bstring

title: bstring(3)

summary: операции над байтовыми строками

text:
# bstring(3)

## ИМЯ
bcmp, bcopy, bzero, memccpy, memchr, memcmp, memcpy, memfrob, memmem, memmove, memset - операции над байтовыми строками

## ОБЗОР

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

```
int bcmp(const void *s1, const void *s2, size_t n);
```

```
void bcopy(const void *src, void *dest, size_t n);
```

```
void bzero(void *s, size_t n);
```

```
void *memccpy(void *dest, const void *src, int c, size_t n);
```

```
void *memchr(const void *s, int c, size_t n);
```

```
int memcmp(const void *s1, const void *s2, size_t n);
```

```
void *memcpy(void *dest, const void *src, size_t n);
```

```
void *memfrob(void *s, size_t n);
```

```
void *memmem(const void *haystack, size_t haystacklen,
             const void *needle, size_t needlelen);
```

```
void *memmove(void *dest, const void *src, size_t n);
```

```
void *memset(void *s, int c, size_t n);
```

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

## ЗАМЕЧАНИЯ
Функции bcmp(), bcopy() и bzero() являются устаревшими. Вместо них используйте memcmp(), memcpy() и memset().

## СМОТРИТЕ ТАКЖЕ
bcmp(3), bcopy(3), bzero(3), memccpy(3), memchr(3), memcmp(3), memcpy(3), memfrob(3), memmem(3), memmove(3), memset(3)


bswap

title: bswap(3)

summary: изменяют порядок байт

text:
# bswap(3)

## ИМЯ
bswap_16, bswap_32, bswap_64 - изменяют порядок байт

## ОБЗОР

```
#include <byteswap.h>
```

```
bswap_16(x);
bswap_32(x);
bswap_64(x);
```

## ОПИСАНИЕ
Данные макросы возвращают значение, в котором в 2-, 4- или 8-ми байтных аргументах байты переставлены местами.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные макросы возвращают значение своих аргументов с обратным порядком байт.

## ОШИБКИ
Данные макросы всегда выполняются без ошибок.

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

## ПРИМЕР
Программа, представленная ниже, переставляет байты 8-ми байтного целого, указанного в командной строке. Пример работы программы:

```
$ ./a.out 0x0123456789abcdef
0x123456789abcdef ==> 0xefcdab8967452301
```

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

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

    uint64_t x;

    if (argc != 2) {

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

        exit(EXIT_FAILURE);

    }

    x = strtoul(argv[1], NULL, 0);

    printf("0x%" PRIx64 " ==> 0x%" PRIx64 "\n", x, bswap_64(x));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
byteorder(3), endian(3)