title: mq_getattr(3)

text:
# mq_getattr(3)

## ИМЯ
mq_getattr, mq_setattr - возвращает/изменяет атрибуты очереди сообщений

## ОБЗОР

```
#include <mqueue.h>
```

```
int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
```

```
int mq_setattr(mqd_t mqdes, const struct mq_attr *newattr,
                 struct mq_attr *oldattr);
```

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

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

Функция mq_getattr() возвращает структуру mq_attr в буфер, указанный в attr. Эта структура определена следующим образом:

```
struct mq_attr {

    long mq_flags;       /* флаги: 0 или O_NONBLOCK */

    long mq_maxmsg;      /* макс. кол-во сообщений в очереди */

    long mq_msgsize;     /* макс. размер сообщения (в байтах) */

    long mq_curmsgs;     /* кол-во сообщений в очереди в данный момент */
};
```

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

Поля mq_maxmsg и mq_msgsize заполняются при создании очереди сообщений с помощью mq_open(3). В поле mq_maxmsg содержится верхний предел на количество сообщений, которое может поместиться в очереди с помощью mq_send(3). В поле mq_msgsize содержится верхний предел на размер сообщений, которые могут помещаться в очередь. Значение обоих полей должно быть больше нуля. Два файла в /proc, в которых размещаются значения этих полей, описаны в mq_overview(7).

В поле mq_curmsgs возвращается количество сообщений в очереди в текущей момент времени.

Функция mq_setattr() изменяет атрибуты очереди согласно информации из передаваемой структуры mq_attr, на которую указывает newattr. Единственным атрибутом, который можно изменить, является флаг O_NONBLOCK в mq_flags. Остальные поля в newattr игнорируются. Если поле oldattr не равно NULL, то буфер, на который оно указывает, используется для возврата структуры mq_attr, с той же информацией как после вызова mq_getattr().

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

## ОШИБКИ
EBADF

В mqdes размещён некорректный дескриптор очереди сообщений.

EINVAL

В newattr->mq_flags содержится набор битов, отличный от O_NONBLOCK.

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

Интерфейс

Атрибут

Значение

mq_getattr(), mq_setattr()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В Linux, mq_getattr() и mq_setattr() является библиотечными функциями, реализованными на основе системного вызова mq_getsetattr(2).

## ПРИМЕР
Программу, представленную ниже, можно использовать для просмотра значений по умолчанию mq_maxmsg и mq_msgsize, которые назначаются очереди сообщений, создаваемой вызовом mq_open(3) с аргументом attr, равным NULL. Пример работы программы:

```
$ ./a.out /testq
Максимальное количество сообщений в очереди:   10
Максимальный размер сообщения:             8192
```

Начиная с Linux 3.5 для управления значениями по умолчанию можно использовать следующие файлы в /proc (описаны в mq_overview(7)):

```
$ uname -sr
Linux 3.8.0
$ cat /proc/sys/fs/mqueue/msg_default
10
$ cat /proc/sys/fs/mqueue/msgsize_default
8192
```

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

```
#include <mqueue.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \

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

    mqd_t mqd;

    struct mq_attr attr;

    if (argc != 2) {

        fprintf(stderr, "Использование: %s mq-name\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    mqd = mq_open(argv[1], O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, NULL);

    if (mqd == (mqd_t) -1)

        errExit("mq_open");

    if (mq_getattr(mqd, &attr) == -1)

        errExit("mq_getattr");

    printf("Максимальное количество сообщений в очереди:   %ld\n", attr.mq_maxmsg);

    printf("Максимальный размер сообщения:             %ld\n", attr.mq_msgsize);

    if (mq_unlink(argv[1]) == -1)

        errExit("mq_unlink");

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)


package: man-pages-ru

title: mq_notify(3)

text:
# mq_notify(3)

## ИМЯ
mq_notify - включает уведомление при поступлении сообщения

## ОБЗОР

```
#include <mqueue.h>
```

```
int mq_notify(mqd_t mqdes, const struct sigevent *sevp);
```

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

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

Аргумент sevp является указателем на структуру sigevent. Определение и описание структуры смотрите в sigevent(7).

Если sevp не равен null, то mq_notify() регистрирует вызывающий процесс для получения уведомлений о сообщениях. В поле sigev_notify структуры sigevent, на которую указывает sevp, задаётся способ выполнения уведомления. Это поле может содержать одно из следующих значений:

SIGEV_NONE

«Нулевое» уведомление: хотя вызывающий процесс и регистрируется как уведомляемый, при появлении сообщения уведомление не будет отправлено.

SIGEV_SIGNAL

Уведомлять процесс посредством отправки сигнала, указанного в sigev_signo. Подробности смотрите в sigevent(7). Поле si_code структуры siginfo_t будет изменено на SI_MESGQ. Также, значение si_pid будет изменено на PID процесса, который посылается сообщение, а значение si_uid будет изменено на реальный пользовательский ID посылающего процесса.

SIGEV_THREAD

При доставке сообщения вызвать sigev_notify_function, как если бы это была начальная функция новой нити. Подробности смотрите в sigevent(7).

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

Если sevp равно NULL и вызывающий процесс уже зарегистрирован принимать сообщения для этой очереди сообщений, то регистрация удаляется; после этого другой процесс может зарегистрироваться для получения уведомлений о сообщениях в этой очереди.

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

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

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

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

## ОШИБКИ
EBADF

В mqdes размещён некорректный дескриптор очереди сообщений.

EBUSY

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

EINVAL

Значение sevp->sigev_notify содержит недопустимое значение; или sevp->sigev_notify равно SIGEV_SIGNAL и sevp->sigev_signo не содержит корректного номера сигнала.

ENOMEM

Недостаточно памяти.

В POSIX.1-2008 сказано, что реализация может генерировать ошибку EINVAL, если sevp равно NULL, и вызывающий ещё не зарегистрирован для получения уведомлений из очереди mqdes.

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

Интерфейс

Атрибут

Значение

mq_notify()

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

MT-Safe

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

## ЗАМЕЧАНИЯ

### Отличия между библиотекой C и ядром
В glibc библиотечная функция mq_notify() реализована на основе системного вызова с тем же именем. Если sevp равно NULL или задаёт механизм уведомления не SIGEV_THREAD, то библиотечная функция напрямую вызывает системный вызов. Большая часть реализации SIGEV_THREAD располагается внутри библиотеки, а не в ядре (эта необходимость возникает из-за того, что нить, вовлечённая в обработку уведомления, должна управляться в библиотечной реализации C нитей POSIX). В реализации задействуется неструктурированный сокет netlink(7) и создаётся новая нить для каждого уведомления, доставляемого процессу.

## ПРИМЕР
В следующей программе показана регистрация запроса уведомления для очереди сообщений с именем, указанном в аргументе командной строки. Уведомление выполняется создаваемой нитью. Нить выполняет функцию, которая читает одно сообщение из очереди и завершает процесс.

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

```
#include <pthread.h>
#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define handle_error(msg) \

    do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void                     /* начальная функция нити */
tfunc(union sigval sv)
{

    struct mq_attr attr;

    ssize_t nr;

    void *buf;

    mqd_t mqdes = *((mqd_t *) sv.sival_ptr);
/* Определяем максимальный размер сообщения; выделяем буфер для принимаемого сообщения */

    if (mq_getattr(mqdes, &attr) == -1)

        handle_error("mq_getattr");

    buf = malloc(attr.mq_msgsize);

    if (buf == NULL)

        handle_error("malloc");

    nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL);

    if (nr == -1)

        handle_error("mq_receive");

    printf("Read %zd bytes from MQ\n", nr);

    free(buf);

    exit(EXIT_SUCCESS);         /* Завершение процесса */
}
int
main(int argc, char *argv[])
{

    mqd_t mqdes;

    struct sigevent sev;

    if (argc != 2) {

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

        exit(EXIT_FAILURE);

    }

    mqdes = mq_open(argv[1], O_RDONLY);

    if (mqdes == (mqd_t) -1)

        handle_error("mq_open");

    sev.sigev_notify = SIGEV_THREAD;

    sev.sigev_notify_function = tfunc;

    sev.sigev_notify_attributes = NULL;

    sev.sigev_value.sival_ptr = &mqdes;   /* аргументы функции нити */

    if (mq_notify(mqdes, &sev) == -1)

        handle_error("mq_notify");

    pause();    /* процесс будет завершён из функции нити */
}
```

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7), sigevent(7)


title: mq_open(3)

summary: открывает очередь сообщений

text:
# mq_open(3)

## ИМЯ
mq_open - открывает очередь сообщений

## ОБЗОР

```
#include <fcntl.h>           /* Постоянные вида O_* */
#include <sys/stat.h>        /* Постоянные для mode */
#include <mqueue.h>
```

```
mqd_t mq_open(const char *name, int oflag);
mqd_t mq_open(const char *name, int oflag, mode_t mode,
              struct mq_attr *attr);
```

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

## ОПИСАНИЕ
Функция mq_open() создает новую очередь сообщений POSIX или открывает существующую очередь. Очередь опознаётся по имени name. Для получения дополнительной информации о создании имени name, смотрите mq_overview(7).

В параметре oflag задаются флаги, которые управляют работой вызова (значения флагов могут быть получены при включении <fcntl.h>). Поместить в параметр oflag можно только один из ниже приведенных флагов:

O_RDONLY

Открыть очередь только для получения сообщений.

O_WRONLY

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

O_RDWR

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

Также в oflag можно добавить ноль и более флагов, объединённых через ИЛИ:

O_CLOEXEC (начиная с Linux 2.6.26)

Установить флаг close-on-exec на файловом дескрипторе очереди сообщений. Описание полезности этого флага смотрите в open(2).

O_CREAT

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

O_EXCL

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

O_NONBLOCK

Открыть очередь в неблокирующем режиме. При обстоятельствах, из-за которых mq_receive(3) и mq_send(3), обычно, блокируются, теперь эти функции будут завершаться ошибкой EAGAIN.

Если в oflag указан O_CREAT, требуется задать два дополнительных аргумента. В аргументе mode задаются права доступа к новой очереди, как для open(2) (символические определения бит прав можно получить, включив <sys/stat.h>). В настройках прав учитывается umask процесса.

В полях структуры struct mq_attr, на которую указывает attr, задаётся максимальное количество сообщений и максимальный размер сообщений, разрешённых в очереди. Эта структура определена следующим образом:

```
struct mq_attr {

    long mq_flags;       /* флаги (игнорируются в mq_open()) */

    long mq_maxmsg;      /* макс. кол-во сообщений в очереди */

    long mq_msgsize;     /* макс. размер сообщения (в байтах) */

    long mq_curmsgs;     /* кол-во сообщений в очереди в данный момент

                            (игнорируется в mq_open()) */
};
```

В функции mq_open() используются только поля mq_maxmsg и mq_msgsize; остальные значения полей игнорируются.

Если attr равно NULL, то очередь создаётся с атрибутами по умолчанию, зависящими от реализации. Начиная с Linux 3.5, для управления атрибутами по умолчанию можно управлять через два файла в /proc; подробности смотрите в mq_overview(7).

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

## ОШИБКИ
EACCES

Очередь существует, но вызывающий не имеет прав для её открытия с заданным в mode режиме.

EACCES

Поле name содержит больше чем одну косую черту.

EEXIST

В oflag указаны O_CREAT и O_EXCL, но очередь name уже существует.

EINVAL

Параметр name не соответствует формату, описанному в mq_overview(7).

EINVAL

В oflag указан O_CREAT и attr не равно NULL, но в attr->mq_maxmsg или attr->mq_msqsize содержится некорректное значение. Оба этих поля должны быть больше нуля. Если процесс без прав (не имеет мандата CAP_SYS_RESOURCE), то attr->mq_maxmsg должно быть меньше или равно ограничению msg_max и attr->mq_msgsize должно быть меньше или равно ограничению msgsize_max. Также, даже для привилегированных процессов, значение attr->mq_maxmsg не должно превышать ограничения HARD_MAX (описание ограничений смотрите в mq_overview(7)).

EMFILE

Было достигнуто ограничение на количество открытых дескрипторов файлов и очередей сообщений (смотрите описание RLIMIT_NOFILE в getrlimit(2)).

ENAMETOOLONG

Слишком длинное значение аргумента name.

ENFILE

Достигнуто ограничение на общее количество открытых файлов в системе и очередей сообщений.

ENOENT

В oflag не указан O_CREAT и не существует очередь name.

ENOENT

В name есть только «/» и нет других символов.

ENOMEM

Недостаточно памяти.

ENOSPC

Недостаточно места для создания новой очереди сообщений. Вероятно, это произошло из-за ограничения queues_max; смотрите mq_overview(7).

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

Интерфейс

Атрибут

Значение

mq_open()

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

MT-Safe

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

## ЗАМЕЧАНИЯ

### Отличия между библиотекой C и ядром
Библиотечная функция mq_open() реализована поверх системного вызова с тем же именем. Библиотечная функция выполняет проверку того, что name начинается с косой черты (/) и выдаёт ошибку EINVAL, если это не так. Системный вызов ядра ожидает name без начальной косой черты, поэтому библиотечная функция C передаёт в системный вызов name без начальной косой черты (т. е., name+1).

## ДЕФЕКТЫ
В ядрах до версии 2.6.14, значение umask процесса не накладывалось на права, указанные в mode.

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)


title: mq_receive(3)

summary: выбирают сообщения из очереди сообщений

text:
# mq_receive(3)

## ИМЯ
mq_receive, mq_timedreceive - выбирают сообщения из очереди сообщений

## ОБЗОР

```
#include <mqueue.h>
```

```
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
                   size_t msg_len, unsigned int *msg_prio);
```

```
#include <time.h>
#include <mqueue.h>
```

```
ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr,
                   size_t msg_len, unsigned int *msg_prio,
                   const struct timespec *abs_timeout);
```

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

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

mq_timedreceive():

_POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функция mq_receive() удаляет самое старое сообщение с наивысшим приоритетом из очереди сообщений, на которою указывает дескриптор очереди сообщений mqdes, и помещает сообщение в буфер, на который указывает msg_ptr. В аргументе msg_len задаётся размер буфера, на который указывает msg_ptr; он должен быть больше или равен атрибуту очереди mq_msgsize (смотрите mq_getattr(3)). Если msg_prio не равно NULL, то указанный в нём буфер используется для возврата приоритета, связанного с полученным сообщением.

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

Функция mq_timedreceive() действует подобно mq_receive(), за исключением того, что если очередь пуста и в описании очереди сообщений не установлен флаг O_NONBLOCK, то abs_timeout указывает на структуру, которой задаётся длительность блокировки вызова. Это абсолютное значение задаётся в секундах и наносекундах начиная с Эпохи, 1970-01-01 00:00:00 +0000 (UTC) в структуре вида:

```
struct timespec {

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

    long   tv_nsec;       /* наносекунды */
};
```

Если сообщения нет и вышло время ожидания на момент вызова, то mq_timedreceive() сразу же завершается.

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

## ОШИБКИ
EAGAIN

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

EBADF

В mqdes указан некорректный или не открытый на чтение дескриптор.

EINTR

Вызов был прерван обработчиком сигнала; смотрите signal(7).

EINVAL

Вызов бы заблокировался и в abs_timeout указано некорректное значение, так как tv_sec меньше нуля или tv_nsec меньше нуля или более 1000 миллионов.

EMSGSIZE

msg_len меньше чем свойство очереди сообщений, mq_msgsize.

ETIMEDOUT

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

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

Интерфейс

Атрибут

Значение

mq_receive(), mq_timedreceive()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В Linux, mq_receive() является системным вызовом, а mq_timedreceive() — библиотечной функцией, реализованной на основе этого системного вызова:

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_send(3), mq_unlink(3), mq_overview(7), time(7)


title: mq_send(3)

text:
# mq_send(3)

## ИМЯ
mq_send, mq_timedsend - отправляет сообщение в очередь сообщений

## ОБЗОР

```
#include <mqueue.h>
```

```
int mq_send(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned int msg_prio);
```

```
#include <time.h>
#include <mqueue.h>
```

```
int mq_timedsend(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned int msg_prio,
              const struct timespec *abs_timeout);
```

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

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

mq_timedsend():

_POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функция mq_send() добавляет сообщение, на которое указывает msg_ptr, в очередь сообщений, на которую ссылается дескриптор очереди сообщений mqdes. В аргументе msg_len задаётся длина сообщения, на которое указывает msg_ptr; эта длина должна быть меньше или равно атрибуту очереди mq_msgsize. Допускаются сообщения нулевой длины.

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

Если очередь сообщений заполнена (т. е., количество сообщений в очереди равно атрибуту очереди mq_maxmsg), то по умолчанию mq_send() блокируется до появления места для записи сообщения, или пока вызов не будет прерван обработчиком сигнала. Если в описании очереди сообщений включён флаг O_NONBLOCK, то вместо этого вызов сразу завершается с ошибкой EAGAIN.

Функция mq_timedsend() действует подобно mq_send(), за исключением того, что если очередь пуста и в описании очереди сообщений не установлен флаг O_NONBLOCK, то abs_timeout указывает на структуру, в которой задаётся длительность блокировки вызова. Это абсолютное значение задаётся в секундах и наносекундах начиная с Эпохи, 1970-01-01 00:00:00 +0000 (UTC), в структуре вида:

```
struct timespec {

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

    long   tv_nsec;       /* наносекунды */
};
```

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

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

## ОШИБКИ
EAGAIN

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

EBADF

В mqdes указан некорректный или не открытый на запись дескриптор.

EINTR

Вызов был прерван обработчиком сигнала; смотрите signal(7).

EINVAL

Вызов бы заблокировался и в abs_timeout указано некорректное значение, так как tv_sec меньше нуля или tv_nsec меньше нуля или более 1000 миллионов.

EMSGSIZE

msg_len больше, чем свойство очереди сообщений mq_msgsize.

ETIMEDOUT

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

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

Интерфейс

Атрибут

Значение

mq_send(), mq_timedsend()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В Linux mq_timedsend() является системным вызовом, а mq_send() — библиотечной функцией, реализованной на основе этого системного вызова:

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_unlink(3), mq_overview(7), time(7)


title: mq_unlink(3)

summary: удаляет очередь сообщений

text:
# mq_unlink(3)

## ИМЯ
mq_unlink - удаляет очередь сообщений

## ОБЗОР

```
#include <mqueue.h>
```

```
int mq_unlink(const char *name);
```

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

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

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

## ОШИБКИ
EACCES

Вызывающий не имеет прав на доступ для отсоединения очереди сообщений.

ENAMETOOLONG

Слишком длинное значение аргумента name.

ENOENT

Очередь сообщений с указанным name отсутствует.

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

Интерфейс

Атрибут

Значение

mq_unlink()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_overview(7)


mtrace

title: mtrace(3)

summary: трассировка malloc

text:
# mtrace(3)

## ИМЯ
mtrace, muntrace - трассировка malloc

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

void mtrace(void);

void muntrace(void);

## ОПИСАНИЕ
Функция mtrace() устанавливает перехватывающие функции (hook functions) на функции выделения памяти (malloc(3), realloc(3), memalign(3), free(3)). Эти перехватывающие функции записывают трассировочную информация о выделении и освобождении памяти. Информация о трассировке может использоваться в программе для обнаружения утечек памяти и попыток освобождения не выделенной памяти.

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

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

Если MALLOC_TRACE не существует или указанный путь некорректен или недоступен для записи, то перехватывающие функции не устанавливаются и mtrace() ничего не делает. Для программ с установленными set-user-ID и set-group-ID переменная MALLOC_TRACE игнорируется и mtrace() ничего не делает.

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

Интерфейс

Атрибут

Значение

mtrace(), muntrace()

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

MT-Unsafe

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

## ЗАМЕЧАНИЯ
В обычной работе mtrace() вызывается один раз в начале выполнения программы, а muntrace() никогда не вызывается.

Результат трассировки после вызова mtrace() имеет текстовый формат, не предназначенный для чтения человеком. В библиотеке GNU C есть сценарий Perl, mtrace(1), который преобразует журнал трассировки в читаемый вид. Для лучших результатов трассируемая программа должна быть скомпилирована с включённой отладкой для того, чтобы в исполняемый файл попала информация c номерами строк.

Трассировка, выполняемая mtrace(), ухудшает производительность (если MALLOC_TRACE указывает на корректный, доступный на запись файл).

## ДЕФЕКТЫ
Информация о номере строки, выдаваемая в mtrace(1), не всегда точна: номер строки может ссылаться на предыдущую или следующую (не пустую) строку исходного кода.

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

```
$ cat t_mtrace.c
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{

    int j;

    mtrace();

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

        malloc(100);            /* никогда не освобождается — утечка памяти */

    calloc(16, 16);             /* Никогда не освобождается — утечка памяти */

    exit(EXIT_SUCCESS);
}
```

При выполнении этой программы мы видим, что mtrace() обнаружила утечку памяти в двух местах программы:

```
$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memory not freed:
-----------------

   Address     Size     Caller
0x084c9378     0x64  at /home/cecilia/t_mtrace.c:12
0x084c93e0     0x64  at /home/cecilia/t_mtrace.c:12
0x084c9448    0x100  at /home/cecilia/t_mtrace.c:16
```

Первые два сообщения о не освобожденной памяти относятся к двум вызовам malloc(3), сделанным внутри цикла for. Заключительное сообщение относится к вызову calloc(3) (которая, в свою очередь, вызывает malloc(3)).

## СМОТРИТЕ ТАКЖЕ
mtrace(1), malloc(3), malloc_hook(3), mcheck(3)


title: nan(3)

text:
# nan(3)

## ИМЯ
nan, nanf, nanl - возвращает «Not a Number» (не является числом)

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

double nan(const char *tagp);

float nanf(const char *tagp);

long double nanl(const char *tagp);

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

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

nan(), nanf(), nanl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Данные функции возвращают представление (определённое в tagp) тихого NaN. Если реализация не поддерживает тихие (quiet) NaN, данные функции возвращают ноль.

Вызов nan("символьная последовательность") равнозначен следующему:

```
strtod("NAN(символьная последовательность)", NULL);
```

Вызовы nanf() и nanl() эквивалентны аналогичным вызовам strtof(3) и strtold(3).

Использование аргумента tagp не регламентировано. В системах, совместимых с IEEE 754, существует несколько реализаций NaN, и tagp используется в одной из них. В других системах он может ничего не делать.

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

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

Интерфейс

Атрибут

Значение

nan(), nanf(), nanl()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
C99, POSIX.1-2001, POSIX.1-2008. См. также IEC 559 и приложение с рекомендуемыми функциями в IEEE 754/IEEE 854.

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


netlink

title: netlink(3)

summary: макросы netlink

text:
# netlink(3)

## ИМЯ
netlink - макросы netlink

## ОБЗОР

```
#include <asm/types.h>
#include <linux/netlink.h>
```

```
int NLMSG_ALIGN(size_t len);
int NLMSG_LENGTH(size_t len);
int NLMSG_SPACE(size_t len);
void *NLMSG_DATA(struct nlmsghdr *nlh);
struct nlmsghdr *NLMSG_NEXT(struct nlmsghdr *nlh, int len);
int NLMSG_OK(struct nlmsghdr *nlh, int len);
int NLMSG_PAYLOAD(struct nlmsghdr *nlh, int len);
```

## ОПИСАНИЕ
В <linux/netlink.h> описаны различные стандартные макросы для доступа или создания дейтаграмм netlink. По сути, они подобны макросам, определённым в cmsg(3) для обычных данных. Работа с буфером, передаваемом или получаемом из сокета netlink, должна выполняться только с помощью этих макросов.

NLMSG_ALIGN()

Выравнивает длину сообщения netlink до корректного значения.

NLMSG_LENGTH()

Рассматривает длину полезной нагрузки len как аргумент и возвращает выравненную длину в поле nlmsg_len структуры nlmsghdr.

NLMSG_SPACE()

Возвращает количество байтов сообщения netlink с полезной нагрузкой длинной len.

NLMSG_DATA()

Возвращает указатель на полезную нагрузку, относящуюся к указанной структуре nlmsghdr.

NLMSG_NEXT()

Получает следующую структуру nlmsghdr в сообщении, состоящем из нескольких частей. При вызове необходимо убедиться, что в текущей структуре nlmsghdr не установлен флаг NLMSG_DONE — эта функция не возвращает NULL в конце. Параметр len — это величина lvalue, указывающая на оставшуюся длину буфера сообщения. Этот макрос уменьшает её на размер заголовка сообщения.

NLMSG_OK()

Возвращает значение «истина», если сообщение netlink не обрезано и готово к обработке.

NLMSG_PAYLOAD()

Возвращает длину полезной нагрузки, связанной с nlmsghdr.

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

## ЗАМЕЧАНИЯ
В большинстве случаев лучше использовать netlink с помощью функций библиотеки libnetlink, а не через низкоуровневый интерфейс ядра.

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


newlocale

title: newlocale(3)

text:
# newlocale(3)

## ИМЯ
newlocale, freelocale - создаёт, изменяет и освобождает объект локали

## ОБЗОР

```
#include <locale.h>
```

```
locale_t newlocale(int category_mask, const char *locale,
                   locale_t base);
```

```
void freelocale(locale_t locobj);
```

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

newlocale(), freelocale():

Начиная с glibc 2.10:

_XOPEN_SOURCE >= 700

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция newlocale() создаёт новый объект локали или изменяет существующий, возвращая ссылку на новый или изменённый объект. Значение base определяет что именно делает вызов — создаёт или изменяет существующий объект:

- Если base равно (locale_t) 0, то создаётся новый объект.

- Если base ссылается на корректный существующий объект локали (т. е., объект, полученный ранее от вызовов newlocale() или duplocale(3)), то этот объект изменяется при вызове. При успешном выполнении содержимое base не определено (в частности, объект, на который ссылается base, может быть освобождён и создан новый объект). Поэтому вызывающий должен понимать до вызова newlocale(), что не использует base, и, следовательно, ссылаться на изменённый объект через ссылку, возвращённую функцией. При ошибке вызова, содержимое base остаётся корректным и не изменяется.

Если значение base равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или не равно (locale_t) 0 и это некорректный указатель объекта локали, то поведение не определено.

Аргумент category_mask представляет собой битовую маску, которая определяет категории локали, устанавливаемые в создаваемом объекте локали или в изменяемом существующем объекте. Маска создаёт побитовым OR из констант LC_ADDRESS_MASK, LC_CTYPE_MASK, LC_COLLATE_MASK, LC_IDENTIFICATION_MASK, LC_MEASUREMENT_MASK, LC_MESSAGES_MASK, LC_MONETARY_MASK, LC_NUMERIC_MASK, LC_NAME_MASK, LC_PAPER_MASK, LC_TELEPHONE_MASK и LC_TIME_MASK. Также значением маски может быть LC_ALL_MASK, которая эквивалентна сложению всех указанных ранее констант.

Для каждой категории, указанной в category_mask, данные локали из locale будут использованы в объекте, возвращаемом newlocale(). Если создаётся новый объект локали, то данные для всех категорий, не указанных в category_mask, берутся из локали по умолчанию («POSIX»).

Для всех категорий, которые можно указать в category_mask, уже определены следующие значения locale:

"POSIX"

Минимальное окружение локали для программ на языке Си.

"C"

Эквивалентно «POSIX».

""

Определяемое реализацией родное окружение соответствует значениям переменных окружения LC_* и LANG (смотрите locale(7)).

### freelocale()
Функция freelocale() освобождает ресурсы, связанные с locobj, объектом локали, ранее полученным из вызова newlocale() или duplocale(3). Если значение locobj равно LC_GLOBAL_LOCALE или не является корректным объектом локали, то результат не определён.

После того, как объект локали освобождён, программа не должна больше его использовать.

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

## ОШИБКИ
EINVAL

Один или более бит в category_mask не соответствуют корректной категории локали.

EINVAL

Значение locale равно NULL.

ENOENT

Значение locale не является указателем на строку, ссылающуюся на корректную локаль.

ENOMEM

Недостаточно памяти для создания объекта локали.

## ВЕРСИИ
Функции newlocale() и freelocale() впервые появились в версии 2.3 библиотеки GNU C.

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

## ЗАМЕЧАНИЯ
Каждый объект локали, созданный newlocale(), должен освобождаться с помощью freelocale().

## ПРИМЕР
Следующая программа принимает два аргумента командной строки, каждый из которых описывает локаль. Первый аргумент обязателен и используется для назначения категории LC_NUMERIC в объекте локали, создаваемой newlocale(). Второй аргумент необязателен; если он задан, то используется для назначения категории LC_TIME объекта локали.

После создания и инициализации объекта, программа применяет его с помощью uselocale(3), а затем тестирует изменения локали:

1.

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

2.

Выводит дату. На формат и язык влияет значение LC_TIME.

В следующих сеансах работы показан пример запуска программы.

Категории LC_NUMERIC присвоено fr_FR (французская):

```
$ ./a.out fr_FR
123456,789
Fri Mar  7 00:25:08 2014
```

Категории LC_NUMERIC присвоено fr_FR (французская), а категории LC_TIME — it_IT (итальянская):

```
$ ./a.out fr_FR it_IT
123456,789
ven 07 mar 2014 00:26:01 CET
```

Значению LC_TIME присвоена пустая строка, что приводит к получению настройки из переменных окружения (которые, в данном случае, равны mi_NZ, новозеландская маори):

```
$ LC_ALL=mi_NZ ./a.out fr_FR ""
123456,789
Te Paraire, te 07 o Poutū-te-rangi, 2014 00:38:44 CET
```

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

```
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \

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

    char buf[100];

    time_t t;

    size_t s;

    struct tm *tm;

    locale_t loc, nloc;

    if (argc < 2) {

        fprintf(stderr, "Использование: %s лок1 [лок2]\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    /* создание нового объекта локали, получение LC_NUMERIC

       из локали, указанной в argv[1] */

    loc = newlocale(LC_NUMERIC_MASK, argv[1], (locale_t) 0);

    if (loc == (locale_t) 0)

        errExit("newlocale");

    /* Если в командной строке указан второй аргумент, то в объекте

       локали изменяется настройка LC_TIME, которая берётся из локали,

       указанной в argv[2]. Мы назначаем результат вызова newlocale()

       «nloc», а не «loc», так как в некоторых случаях может

       потребоваться сохранить «loc», если этот вызов завершится

       с ошибкой. */

    if (argc > 2) {

        nloc = newlocale(LC_TIME_MASK, argv[2], loc);

        if (nloc == (locale_t) 0)

            errExit("newlocale");

        loc = nloc;

    }

    /* Применение созданной локали к этой нити */

    uselocale(loc);

    /* Тест влияния LC_NUMERIC */

    printf("%8.3f\n", 123456.789);

    /* Тест влияния LC_TIME */

    t = time(NULL);

    tm = localtime(&t);

    if (tm == NULL)

        errExit("time");

    s = strftime(buf, sizeof(buf), "%c", tm);

    if (s == 0)

        errExit("strftime");

    printf("%s\n", buf);

    /* Освобождение объекта локали */

    freelocale(loc);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
locale(1), duplocale(3), setlocale(3), uselocale(3), locale(5), locale(7)


nextafter

title: nextafter(3)

text:
# nextafter(3)

## ИМЯ
nextafter, nextafterf, nextafterl, nexttoward, nexttowardf, nexttowardl - операции над числами с плавающей запятой

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

double nextafter(double x, double y);

float nextafterf(float x, float y);

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

double nexttoward(double x, long double y);

float nexttowardf(float x, long double y);

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

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

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

nextafter():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

nextafterf(), nextafterl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

nexttoward(), nexttowardf(), nexttowardl(): _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функции nextafter(), nextafterf() и nextafterl() возвращают следующее представимое значение с плавающей запятой после x по направлению к y. Если y меньше x, то эти функции возвращают наибольшее представимое число, которое меньше x.

Если x = y, то функции возвращают y.

Функции nexttoward(), nexttowardf() и nexttowardl() делают то же, что и функции nextafter(), за исключением того, что у них второй аргумент имеет тип long double.

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

Если x = y, то возвращается значение y (приведённое к типу x).

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

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

Если x не равно y, и правильный результат функции был бы субнормальным, нулём или возникала бы исчерпание степени, ошибка диапазона, то возвращается любое правильное значение (если оно представимо) или 0,0.

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

nextafter(), nextafterf(), nextafterl(), nexttoward(), nexttowardf(), nexttowardl()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
C99, POSIX.1-2001, POSIX.1-2008. Эта функция определена в IEC 559 (и в приложении с рекомендуемыми функциями IEEE 754/IEEE 854).

## ДЕФЕКТЫ
В glibc 2.5 и младше данные функции не вызывают исключение исчерпания степени плавающей запятой (FE_UNDERFLOW) при возникновении ошибки исчерпания степени.

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


nextup

title: nextup(3)

summary: возвращают

text:
# nextup(3)

## ИМЯ
nextup, nextupf, nextupl, nextdown, nextdownf, nextdownl - возвращают следующее число с плавающей запятой, учитывая положительную/отрицательную бесконечность

## ОБЗОР

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

```
double nextup(double x);
float nextupf(float x);
long double nextupl(long double x);
```

```
double nextdown(double x);
float nextdownf(float x);
long double nextdownl(long double x);
```

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

## ОПИСАНИЕ
Функции nextup(), nextupf() и nextupl() возвращают следующее представимое число с плавающей запятой, которое больше x.

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

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

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

Значение, возвращаемое nextdown(x), равно -nextup(-x) и похожее делается для других типов.

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

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

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

Интерфейс

Атрибут

Значение

nextup(), nextupf(), nextupl(), nextdown(), nextdownf(), nextdownl()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции описаны в IEEE Std 754-2008 - Standard for Floating-Point Arithmetic и ISO/IEC TS 18661.

## СМОТРИТЕ ТАКЖЕ
nearbyint(3), nextafter(3)


title: nl_langinfo(3)

summary: запрашивает информацию о языке и локали

text:
# nl_langinfo(3)

## ИМЯ
nl_langinfo, nl_langinfo_l - запрашивает информацию о языке и локали

## ОБЗОР

```
#include <langinfo.h>
```

```
char *nl_langinfo(nl_item item);
```

```
char *nl_langinfo_l(nl_item item, locale_t locale);
```

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

nl_langinfo_l():

начиная с glibc 2.24:

_POSIX_C_SOURCE >= 200809L

в glibc 2.23 и старее:

_POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функция nl_langinfo() и nl_langinfo_l() предоставляют более гибкий способ доступа к информации локали, нежели localeconv(3). Функция nl_langinfo() возвращает строку со значением, соответствующим item, из текущей глобальной локали программы. Функциями nl_langinfo() возвращает строку со значением, соответствующим item, из локали, которая определена объектом локали locale (ранее создан с помощью newlocale(1)). Могут быть запрошены индивидуальные, либо дополнительные элементы категорий локали.

В качестве запрашиваемых элементов локали в поле item могут быть указаны определённые в <langinfo.h> константы:

CODESET (LC_CTYPE)

Возвращает строку с названием кодировки символов, используемой в выбранной локали, например «UTF-8», «ISO-8859-1» или «ANSI_X34-1968» (более известной, как US-ASCII). Это такая же строка, которую возвращает команда «locale charmap». Список названий кодировок символов можно получить по команде «locale -m» (смотрите locale(1)).

D_T_FMT (LC_TIME)

Возвращает строку, которую можно использовать как строку формата для функции strftime(3) для представления времени и даты в формате данной локали.

D_FMT (LC_TIME)

Возвращает строку, которую можно использовать как строку формата для функции strftime(3) для представления даты в формате данной локали.

T_FMT (LC_TIME)

Возвращает строку, которую можно использовать как строку формата для функции strftime(3) для представления времени в формате данной локали.

DAY_{1–7} (LC_TIME)

Возвращает название n-го дня недели. ПРЕДУПРЕЖДЕНИЕ: подразумевается формат США, в котором DAY_1 = воскресенье, а не интернациональный формат (ISO 8601), в котором первым днём недели является понедельник.

ABDAY_{1–7} (LC_TIME)

Возвращает сокращённое название n-го дня недели.

MON_{1–12} (LC_TIME)

Возвращает название n-го месяца.

ABMON_{1–12} (LC_TIME)

Возвращает сокращённое название n-го месяца.

RADIXCHAR (LC_NUMERIC)

Возвращает символ разделителя целой и дробной части (десятичную точку, запятую и т. п.).

THOUSEP (LC_NUMERIC)

Возвращает разделитель тысячных разрядов (групп по 3 цифры).

YESEXPR (LC_MESSAGES)

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

NOEXPR (LC_MESSAGES)

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

CRNCYSTR (LC_MONETARY)

Возвращает обозначение валюты, с предшествующими символами: «-», если знак валюты должен стоять перед числами, «+», если знак валюты должен стоять после чисел или «.», если знак валюты должен заменять разделитель целой и дробной части.

Список вышеперечисленных элементов — это всего лишь небольшая часть того, что может быть запрошено. Более подробный список приведён в справочном руководстве по библиотеке GNU C.

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

Если с помощью setlocale(3) не была выбрана локаль для соответствующей категории, то nl_langinfo возвращает указатель на соответствующую строку локали «C». Это же верно и для nl_langinfo_l(), если locale задаёт локаль, в которой не определены данные langinfo.

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

Указатель, возвращаемый этими функциями, может указывать на статические данные, которые могут быть перезаписаны, или сам указатель может стать некорректным при последующих вызовах nl_langinfo, nl_langinfo_l() или setlocale(3). Это же утверждение применимо и к nl_langinfo_l(), если объект локали, на которую указывает locale, освобождается или изменяется функциями freelocale(3) или newlocale(3).

В POSIX указано, что приложение не может изменить строку, возвращаемую этими функциями.

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

Интерфейс

Атрибут

Значение

nl_langinfo()

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

MT-Safe locale

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

## ЗАМЕЧАНИЯ
Поведение nl_langinfo_l() не определено, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE или некорректному описателю объекта локали.

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

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

    setlocale(LC_CTYPE, "");

    setlocale(LC_NUMERIC, "");

    printf("%s\n", nl_langinfo(CODESET));

    printf("%s\n", nl_langinfo(RADIXCHAR));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
locale(1), localeconv(3), setlocale(3), charsets(7), locale(7)

Справочное руководство по библиотеке GNU C (GNU C Library Reference Manual)


title: ntp_gettime(3)

text:
# ntp_gettime(3)

## ИМЯ
ntp_gettime, ntp_gettimex - возвращает параметры времени (интерфейс службы NTP)

## ОБЗОР

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

```
int ntp_gettime(struct ntptimeval *ntv);
```

```
int ntp_gettimex(struct ntptimeval *ntv);
```

## ОПИСАНИЕ
Эти функции возвращают информацию вызывающему через аргумент ntv, структуру следующего вида:

```
struct ntptimeval {

    struct timeval time;        /* текущее время */

    long int maxerror;          /* максимальная ошибка */

    long int esterror;          /* расчётная ошибка */

    long int tai;               /* смещение TAI */

    /* байты-заполнители под будущее расширение */
};
```

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

time

Текущее время, представляется структурой timeval:

```
struct timeval {

    time_t      tv_sec;   /* кол-во секунд, начиная с Эпохи */

    suseconds_t tv_usec;  /* кол-во микросекунд */
};

```

maxerror

Максимальная ошибка, в микросекундах. Это значение может быть инициализировано ntp_adjtime(3), и периодически увеличивается (в Linux каждую секунду), но не переходит верхний порог (константа ядра NTP_PHASE_MAX, равная 16000).

esterror

Расчётная ошибка, в микросекундах. Это значение может быть установлено с помощью ntp_adjtime(3) и содержит расчётную разницу между системными часами и настоящим временем. Данное значение не используется внутри ядра.

tai

Смещение TAI (Atomic International Time, атомное международное время).

Функция ntp_gettime() возвращает структуру ntptimeval с заполненными полями time, maxerror и esterror.

Функция ntp_gettimex() выполняет тоже что и ntp_gettime() и дополнительно возвращает информацию в поле tai.

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

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

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

Интерфейс

Атрибут

Значение

ntp_gettime(), ntp_gettimex()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция ntp_gettime() описана в интерфейсе NTP Kernel Application Program. Функция ntp_gettimex() является расширением GNU.

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

NTP "Kernel Application Program Interface"


offsetof

title: offsetof(3)

summary: смещение элемента структуры

text:
# offsetof(3)

## ИМЯ
offsetof - смещение элемента структуры

## ОБЗОР

```
#include <stddef.h>
```

```
size_t offsetof(type, member);
```

## ОПИСАНИЕ
Макрокоманда offsetof() возвращает смещение поля member от начала структуры type.

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

Если member не выровнен по границе байта (т.е., если это битовое поле), то компилятор вернёт ошибку.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция offsetof() возвращает смещение в байтах указанного поля member внутри указанного type.

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

## ПРИМЕР
В системах Linux/i386 при использовании компилятора gcc(1) с параметрами по умолчанию нижеследующая программа дает следующий результат:

```
$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
```

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

```
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{

    struct s {

        int i;

        char c;

        double d;

        char a[];

    };

    /* Вывод зависит от компилятора */

    printf("offsets: i=%zd; c=%zd; d=%zd a=%zd\n",

            offsetof(struct s, i), offsetof(struct s, c),

            offsetof(struct s, d), offsetof(struct s, a));

    printf("sizeof(struct s)=%zd\n", sizeof(struct s));

    exit(EXIT_SUCCESS);
}
```


title: on_exit(3)

text:
# on_exit(3)

## ИМЯ
on_exit - регистрирует функцию для вызова в случае нормального завершения процесса

## ОБЗОР

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

```
int on_exit(void (*function)(int , void *), void *arg);
```

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

on_exit():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

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

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

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

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

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

Интерфейс

Атрибут

Значение

on_exit()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция впервые появилась в SunOS 4, но также она присутствует в glibc. В Solaris (SunOS 5) её уже нет. Избегайте этой функции и используйте вместо нее стандартную atexit(3).

## ЗАМЕЧАНИЯ
К моменту выполнения function стек переменных (auto) уже может пропасть из области видимости. Поэтому arg не должен быть указателем на переменную в стеке; однако он может быть указателем на переменную в куче или глобальную переменную.

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


title: open_memstream(3)

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

text:
# open_memstream(3)

## ИМЯ
open_memstream, open_wmemstream - открывает динамический буфер памяти как поток

## ОБЗОР

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

```
FILE *open_memstream(char **ptr, size_t *sizeloc);
#include <wchar.h>
```

```
FILE *open_wmemstream(wchar_t **ptr, size_t *sizeloc);
```

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

open_memstream(), open_wmemstream():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция open_memstream() открывает поток для записи в буфер памяти. Буфер выделяется динамически и при необходимости автоматически увеличивается. Первоначально размер буфера равен нулю.После закрытия потока вызывающий должен освободить буфер с помощью free(3).

Аргументы ptr и sizeloc используются для определения текущего положения и размера буфера, соответственно. Положение обновляется при каждом сбросе потока (fflush(3)) и его закрытии (fclose(3)). Эти значения остаются корректными, пока вызывающий не произведёт вывод в поток. После выполнения вывода, перед тем как обращаться к этим переменным, поток снова должен быть сброшен.

Байт null поддерживается в конце буфера. Этот байт не учитывается в значении размера, хранящемся в sizeloc.

Для потока существует понятие текущего положения, которое изначально равно нулю (начало буфера). Каждая операция записи неявно изменяет положение буфера. Положение буфера потока можно изменить явно с помощью fseek(3) или fseeko(3). Перемещение положения буфера за конец уже записанных данных приводит к заполнению промежутка символами null.

Функция open_wmemstream() похожа на open_memstream(), но работает с широкими символами, а не с байтами.

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

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

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

Интерфейс

Атрибут

Значение

open_memstream(), open_wmemstream

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

MT-Safe

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

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

## ДЕФЕКТЫ
В glibc до версии 2.7 перемещение за конец потока, созданного open_memstream(), не приводило к увеличению буфера; вместо этого вызов fseek(3) завершался с ошибкой, возвращая -1.

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

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


opendir

title: opendir(3)

summary: открывает каталог

text:
# opendir(3)

## ИМЯ
opendir, fdopendir - открывает каталог

## ОБЗОР

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

```
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
```

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

fdopendir():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

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

Функция fdopendir() похожа на opendir(), но возвращает поток каталога для каталога, на который ссылается открытый файловый дескриптор fd. После успешного вызова fdopendir(), дескриптор fd используется только внутри реализации и не должен использоваться в приложении.

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

## ОШИБКИ
EACCES

Доступ запрещен.

EBADF

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

EMFILE

Было достигнуто ограничение по количеству открытых файловых дескрипторов на процесс.

ENFILE

Достигнуто максимальное количество открытых файлов в системе.

ENOENT

Каталог не существует, либо name содержит пустую строку.

ENOMEM

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

ENOTDIR

Значение name не является каталогом.

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

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

Интерфейс

Атрибут

Значение

opendir(), fdopendir()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция opendir() присутствует в SVr4, 4.3BSD и описана в стандарте POSIX.1-2001. Функция fdopendir() описана в POSIX.1-2008.

## ЗАМЕЧАНИЯ
Записи имён файлов можно читать из потока каталога с помощью readdir(3).

Задействованный файловый дескриптор потока каталога может быть получен в помощью dirfd(3).

Функция opendir() устанавливает флаг close-on-exec для файлового дескриптора, указывающего на DIR *. Функция fdopendir() оставляет флаг close-on-exec не изменённым для файлового дескриптора fd. В POSIX.1-200x нет точного определения на этот счет, хотя успешный вызов fdopendir() установит флаг close-on-exec для файлового дескриптора fd.

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


openpty

title: openpty(3)

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

text:
# openpty(3)

## ИМЯ
openpty, login_tty, forkpty - функции для работы с терминалом

## ОБЗОР

```
#include <pty.h>
```

```
int openpty(int *amaster, int *aslave, char *name,
            const struct termios *termp,
            const struct winsize *winp);
```

```
pid_t forkpty(int *amaster, char *name,
              const struct termios *termp,
              const struct winsize *winp);
#include <utmp.h>
```

```
int login_tty(int fd);
```

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

## ОПИСАНИЕ
Функция openpty() ищет доступный псевдотерминал и возвращает файловые дескрипторы для его основного и подчинённого устройств в amaster и aslave. Если name не равно NULL, то имя файла подчинённого устройства возвращается в name. Если termp не равно NULL, то параметры терминала подчинённого устройства будут установлены в значения, указанные в termp. Если winp не равно NULL, то размер окна подчинённого устройства будет установлен согласно значениям, указанным в winp.

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

Функция forkpty() объединяет openpty(), fork(2) и login_tty() для создания нового процесса, работающего в псевдотерминале. Файловый дескриптор основной стороны псевдотерминала возвращается в amaster. Если name не равно NULL, то указанный в нём буфер используется для возврата имени файла подчинённого устройства. Если аргументы termp и winp не равны NULL, то в них задаются атрибуты терминала и размеры окна подчинённой стороны псевдотерминала.

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

## ОШИБКИ
Вызов openpty() завершается ошибкой если:

ENOENT

Нет доступных терминалов.

Завершается ошибкой функция login_tty(), если ioctl(2) не может назначить fd управляющему терминалу вызываемого процесса.

Завершается ошибкой функция forkpty(), если не сработает хотя бы одна из функций openpty() или fork(2).

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

Интерфейс

Атрибут

Значение

forkpty(), openpty()

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

MT-Safe locale

login_tty()

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

MT-Unsafe race:ttyname

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции BSD есть в glibc. Они не стандартизированы в POSIX.

## ЗАМЕЧАНИЯ
Модификаторы const были добавлены в аргументы указателей на структуры openpty() и forkpty() в glibc 2.8.

В версиях glibc до 2.0.92, openpty() возвращает файловые дескрипторы для псевдотерминальной пары BSD; начиная с glibc 2.0.92, сначала производится попытка открыть псевдотерминальную пару UNIX 98, а если это не удаётся, то происходит возвращение к открытию псевдотерминальной пары BSD.

## ДЕФЕКТЫ
Невозможно определить сколько места должно быть зарезервировано для name. Поэтому, вызов openpty() или forkpty() со значением name не равным NULL может быть небезопасен.

## СМОТРИТЕ ТАКЖЕ
fork(2), ttyname(3), pty(7)


perror

title: perror(3)

summary: печатает системное сообщение об ошибке

text:
# perror(3)

## ИМЯ
perror - печатает системное сообщение об ошибке

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

void perror(const char *s);

\#include <errno.h>

const char * const sys_errlist[];

int sys_nerr;

int errno; /* в реальности объявлено не так; смотрите errno(3) */

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

sys_errlist, sys_nerr:

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE

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

Сначала печатается строка из аргумента s (если s не равно NULL и *s не указывает на байт null ('\0')), после неё двоеточие и пробел. Затем выводится сообщение о ошибке, соответствующее текущему значению errno, а после этого символ новой строки.

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

Глобальный список ошибок sys_errlist[], к которым можно обращаться по номеру errno, можно использовать для получения сообщения об ошибке без символа новой строки. Самый большой номер сообщения в таблице равен sys_nerr-1. Будьте внимательны при прямом доступе к этому списку, так как новые значения ошибок могут быть ещё не добавлены в sys_errlist[]. В настоящее время использование sys_errlist[] не рекомендуется; вместо этого используйте strerror(3).

Когда завершается ошибкой системный вызов, обычно возвращается -1 и изменяется переменная errno для указания что пошло не так (её значения можно найти в <errno.h>). Многие библиотечные функции работают также. Функция perror() служит для перевода этого кода ошибки в форму, понятную человеку. Заметим, что значение errno не определено после успешного выполнения системного вызова или библиотечной функции: этот вызов может также изменить эту переменную даже при успешном выполнении, например из-за ошибки другой библиотечной функции, которая вызывалась при работе. То есть, если после вызова функции сразу не вызывается perror(), значение errno нужно куда-нибудь сохранить.

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

Интерфейс

Атрибут

Значение

perror()

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

MT-Safe race:stderr

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

Внешние sys_nerr и sys_errlist появились из BSD, и не описаны в POSIX.1.

## ЗАМЕЧАНИЯ
Внешние sys_nerr и sys_errlist определены в glibc, но в файле <stdio.h>.

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


popen

title: popen(3)

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

text:
# popen(3)

## ИМЯ
popen, pclose - конвейерный поток в или из процесса

## ОБЗОР

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

```
FILE *popen(const char *command, const char *type);
```

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

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

popen(), pclose():

_POSIX_C_SOURCE >= 2

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

## ОПИСАНИЕ
Функция popen() открывает процесс следующим образом: создаёт канал, выполняет fork и вызывает командную оболочку. Так как канал задается однонаправленным, в аргументе type может быть задан один режим: либо чтение либо запись.

Аргумент command представляет собой указатель на строку с null в конце, которая содержит командную строку оболочки. Эта команда передаётся в /bin/sh с помощью флага -c; все подстановке в ней выполняются оболочкой.

Аргумент type представляет собой указатель на строку с null в конце, которая содержит или букву 'r' (чтение) или букву 'w' (запись). Начиная с glibc 2.9 в этом аргументе также может быть буква 'e', которая указывает на необходимость установки флага закрытия при выполнении (FD_CLOEXEC) в используемом файловом дескрипторе; про полезность флага O_CLOEXEC смотрите в open(2).

Возвращаемое popen() значение является стандартным потоком ввода-вывода, за исключением того, что его нужно закрывать с помощью pclose(), а не fclose(3). Запись в такой поток выполняет запись в стандартный поток ввода команды; стандартного потока вывода команды тот же, что и у процесса, вызвавшего popen(), если он не был изменён самой командой. При чтении из потока выполняется чтение из стандартного потока вывода команды, а стандартный поток ввода тот же, что и у процесса, вызвавшего popen(), если он не был изменён самой командой.

Заметим, что потоки вывода popen() по умолчанию блокируемые и буферизированные.

Функция pclose() ожидает завершения ассоциированного процесса и возвращает код выхода команды, возвращаемый функцией wait4(2).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
popen(): при успешном выполнении возвращается указатель на открытый поток, его можно использовать для чтения или записи в канал; если вызов fork(2) или pipe(2) завершается с ошибкой или если функция не может выделить память, то возвращается NULL.

pclose(): при успешном выполнении возвращает код завершения команды; если wait4(2) возвращает ошибку или возникает какая-то другая ошибка, то возвращается -1.

Обе функции записывают в errno соответствующее значение ошибки.

## ОШИБКИ
Функция popen() не изменяет errno, если не удалось выделить память. Если завершаются с ошибкой вызовы fork(2) или pipe(2), то в errno содержится номер ошибки. Если значение type некорректно и это обнаружено, то errno присваивается EINVAL.

Если pclose() не удаётся получить код выхода потомка, то errno присваивается ECHILD.

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

Интерфейс

Атрибут

Значение

popen(), pclose()

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

MT-Safe

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

Значение 'e' для type есть только в Linux.

## ЗАМЕЧАНИЯ
Примечание: внимательно прочитайте ЗАМЕЧАНИЯ в system(3).

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

Ошибка при попытке запуска оболочки неотличима от ошибки оболочки при попытке запуска программы или от ошибки при немедленном выходе команды. Единственное отличие это код выхода 127.

## СМОТРИТЕ ТАКЖЕ
sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)


title: posix_fallocate(3)

summary: выделяет пространство для файла

text:
# posix_fallocate(3)

## ИМЯ
posix_fallocate - выделяет пространство для файла

## ОБЗОР

```
#include <fcntl.h>
```

```
int posix_fallocate(int fd, off_t offset, off_t len);
```

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

posix_fallocate():

_POSIX_C_SOURCE >= 200112L

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

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

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

## ОШИБКИ
EBADF

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

EFBIG

Сумма offset+len превышает максимальный размер файла.

EINTR

При выполнении поступил сигнал.

EINVAL

Значение offset меньше, или len меньше или равно 0, или используемая файловая система, хранящая файл, не поддерживает операцию.

ENODEV

Дескриптор fd не указывает на обычный файл.

ENOSPC

Недостаточно дискового пространства на устройстве, на котором расположен файл, указанный в fd.

ESPIPE

Значение fd указывает на канал.

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

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

Интерфейс

Атрибут

Значение

posix_fallocate()

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

MT-Safe (но смотрите ДЕФЕКТЫ)

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

В POSIX.1-2008 указано, что реализация должна возвращать ошибку EINVAL, если len равно 0 или offset меньше 0. В POSIX.1-2001 сказано, что реализация должна возвращать ошибку EINVAL, если len меньше 0 или offset меньше 0, и может возвращать ошибку, если len равно 0.

## ЗАМЕЧАНИЯ
В glibc функция posix_fallocate() реализована с помощью системного вызова fallocate(2), который является нитебезопасным. Если подлежащая файловая система не поддерживает fallocate(2), то операция эмулируется со следующими оговорками:

- Эмуляция не считается эффективной.

- Существует состязательность, где одновременные записи из другой нити или процесса могут быть перезаписаны null байтами.

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

- Если fd был открыт с флагом O_APPEND или O_WRONLY, то функция завершается ошибкой EBADF.

Таким образом, эмуляция не является нитебезопасной. В Linux приложения могут использовать fallocate(2), если для них неприемлемы оговорки эмуляции. В общем, функцию рекомендуется использовать только, если приложение планирует завершить операцию, если возвращается EOPNOTSUPP, в противном случае в приложении нужно реализовать обходное решение проблем эмуляции, предоставляемой glibc.

## СМОТРИТЕ ТАКЖЕ
fallocate(1), fallocate(2), lseek(2), posix_fadvise(2)


title: posix_madvise(3)

text:
# posix_madvise(3)

## ИМЯ
posix_madvise - отсылает предложения по шаблонам использования памяти

## ОБЗОР

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

```
int posix_madvise(void *addr, size_t len, int advice);
```

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

posix_madvise():

_POSIX_C_SOURCE >= 200112L

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

В аргументе advice указывается одно из следующих значений:

POSIX_MADV_NORMAL

Приложение не даёт каких-либо предложений о том, как будет использована память в указанном диапазоне. Поведение по умолчанию.

POSIX_MADV_SEQUENTIAL

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

POSIX_MADV_RANDOM

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

POSIX_MADV_WILLNEED

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

POSIX_MADV_DONTNEED

Приложение не будет обращаться по указанному диапазону адресов в в ближайшем будущем.

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

## ОШИБКИ
EINVAL

Значение addr не кратно размеру системной страницы или значение len отрицательно.

EINVAL

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

ENOMEM

Адреса в указанном диапазоне частично или полностью лежат вне адресного пространства вызывающего.

## ВЕРСИИ
Поддержка posix_madvise() появилась в glibc 2.2.

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

## ЗАМЕЧАНИЯ
В POSIX.1 допускается, что реализация генерирует ошибку, если len равно 0. В Linux допустимо значение len равное 0 (ничего не делается).

В glibc эта функция реализована через вызов madvise(2). Однако, начиная с glibc 2.6, POSIX_MADV_DONTNEED для ничего не делается, так как соответствующее значение в madvise(2), MADV_DONTNEED, имеет разрушительную семантику.

## СМОТРИТЕ ТАКЖЕ
madvise(2), posix_fadvise(2)


title: posix_memalign(3)

summary: выделяет

text:
# posix_memalign(3)

## ИМЯ
posix_memalign, aligned_alloc, memalign, valloc, pvalloc - выделяет выровненную область памяти

## ОБЗОР

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

```
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *valloc(size_t size);
#include <malloc.h>
```

```
void *memalign(size_t alignment, size_t size);
void *pvalloc(size_t size);
```

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

posix_memalign(): _POSIX_C_SOURCE >= 200112L

aligned_alloc(): _ISOC11_SOURCE

valloc():

Начиная с glibc 2.12:

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

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

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

```

До glibc 2.12:

_BSD_SOURCE || _XOPEN_SOURCE >= 500

(Заголовочный файл <malloc.h> (нестандартный) также содержит объявление valloc(); макросов тестирования свойств не требуется)

## ОПИСАНИЕ
Функция posix_memalign() выделяет size байт и помещает адрес выделенной памяти в *memptr. Этот адрес будет кратен значению alignment, которое должно быть степенью двойки и кратно sizeof(void *). Если size равно 0, то значение, помещаемое в *memptr, равно NULL, или является уникальным значением указателя, который позднее можно передавать в free(3).

Устаревшая функция memalign() выделяет size байт и возвращает указатель на выделенную память. Адрес памяти будет кратен значению alignment, которое должны быть степенью двойки.

Функция aligned_alloc() подобна memalign(), но добавляет ограничение для значения size, которое должно быть кратно alignment.

Устаревшая функция valloc() выделяет size байт и возвращает указатель на выделенную память. Адрес памяти будет кратен размеру страницы. Она эквивалентна вызову memalign(sysconf(_SC_PAGESIZE),size).

Устаревшая функция pvalloc() подобна valloc(), но округляет выделяемый размер до следующего кратного значения системной страницы.

Эти функции не обнуляют выделяемую память.

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

При успешном выполнении функция posix_memalign() возвращает ноль и одно из значений, перечисленных в далее, при ошибке. Значение errno не изменяется. В Linux (и других системах) posix_memalign() при ошибке не изменяет memptr. Требование стандартизации такого поведения было добавлено в POSIX.1-2016.

## ОШИБКИ
EINVAL

Аргумент alignment не является степенью двойки или не кратен sizeof(void *).

ENOMEM

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

## ВЕРСИИ
Функции memalign(), valloc() и pvalloc() доступны во всех библиотеках Linux libc.

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

Функция posix_memalign() доступна в glibc начиная с версии 2.1.91.

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

Интерфейс

Атрибут

Значение

aligned_alloc(), memalign(), posix_memalign()

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

MT-Safe

valloc(), pvalloc()

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

MT-Unsafe init

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция valloc() появилась из 3.0BSD. Она описана как устаревшая в 4.3BSD и в SUSv2. Отсутствует в POSIX.1.

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

Функция memalign() появилась из SunOS 4.1.3, но отсутствует в 4.4BSD.

Функция posix_memalign() появилась из POSIX.1d и описана в POSIX.1-2001 и POSIX.1-2008.

Функция aligned_alloc() описана в стандарте C11.

### Заголовки
Функция posix_memalign() везде объявлена в <stdlib.h>.

В некоторых системах memalign() объявлена в <stdlib.h>, а не в <malloc.h>.

В SUSv2 функция valloc() объявлена в <stdlib.h>. В Libc4,5 и glibc она объявлена в <malloc.h>, а также в <stdlib.h>, если определены соответствующие макросы тестирования свойств (смотрите выше).

## ЗАМЕЧАНИЯ
Во многих системах накладываются ограничения по выравниванию, например, на буферы, используемые для прямого ввода-вывода в блочные устройства. В POSIX определён вызов pathconf(path,_PC_REC_XFER_ALIGN), показывающий необходимость выравнивания. В настоящее время можно использовать posix_memalign() для удовлетворения этого требования.

Функция posix_memalign() проверяет, что alignment удовлетворяет требованиям, описанным выше. Функция memalign() может не проверять корректность аргумента alignment.

В POSIX требуется, чтобы память, полученная через posix_memalign(), могла освобождаться с помощью free(3). В некоторых системах отсутствует механизм освобождения памяти, выделенной memalign() или valloc() (так как в них во free(3) передаётся только указатель, полученный из malloc(3), но, например, memalign() выполняет вызов malloc(3) и затем выравнивает полученное значение). Реализация glibc позволяет освобождать память, полученную через эти функции, с помощью free(3).

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

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


title: posix_openpt(3)

summary: открывает псевдо\-терминальное устройство

text:
# posix_openpt(3)

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

## ОБЗОР

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

```
int posix_openpt(int flags);
```

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

posix_openpt(): _XOPEN_SOURCE >= 600

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

Аргумент flags представляет собой битовую маску из комбинации (OR) нуля или более следующих флагов:

O_RDWR

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

O_NOCTTY

Не делать данное устройство управляющим терминалом процесса.

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

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

## ВЕРСИИ
Поддержка posix_openpt() в glibc появилась в версии 2.2.1.

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

Интерфейс

Атрибут

Значение

posix_openpt()

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

MT-Safe

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

Функция posix_openpt() является частью поддержки псевдо-терминалов UNIX 98 (смотрите pts(4)).

## ЗАМЕЧАНИЯ
В некоторых старых реализациях UNIX, поддерживающих System V (также называемом UNIX 98), для псевдо-терминалов нет этой функции, но её легко написать:

```
int
posix_openpt(int flags)
{

    return open("/dev/ptmx", flags);
}
```

При вызове posix_openpt() создаётся путь для соответствующего подчинённого псевдо-терминального устройства. Путь подчинённого устройства можно получить с помощью ptsname(3). Путь подчинённого устройства существует только пока открыто главное устройство.

## СМОТРИТЕ ТАКЖЕ
open(2), getpt(3), grantpt(3), ptsname(3), unlockpt(3), pts(4), pty(7)