getsubopt

title: getsubopt(3)

text:
# getsubopt(3)

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

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

int getsubopt(char **optionp, char * const *tokens, char **valuep);

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

getsubopt():

_XOPEN_SOURCE >= 500

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

## ОПИСАНИЕ
Функция getsubopt() анализирует список подпараметров, указываемых через запятую, заданный в optionp (такой список подпараметров, обычно, создаётся при использовании getopt(3) для разбора командной строки; например, смотрите параметр -o в mount(8)). Каждый подпараметр может содержать связанное с ним значение, которое отделяется от имени подпараметра знаком равно. Вот пример строки, которую можно передать в optionp:

```
ro,name=xyz
```

Аргумент tokens — указатель на массив (завершается NULL) указателей на токены, которые getsubopt() будет просматривать при поиске в optionp. Токены должны быть различающимися строками (завершающимися null), содержащими, как минимум, один символ и не содержащих знаков равно или запятых.

При каждом вызове getsubopt() возвращается информация о следующем необработанном подпараметре в optionp. Первый знак равно в подпараметре (если есть) считается разделителем имени и значения в этом подпараметре. Значение длится до последующей запятой или (для последнего подпараметра) до конца строки. Если имя подпараметра совпадает с известным именем из tokens, и найдено строка-значение, то getsubopt() записывает в *valuep адрес этой строки. Первая запятая в optionp перезаписывается байтом null, поэтому *valuep — точное «строка-значение» этого подпараметра.

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

При завершении работы getsubopt() значение optionp указывает на следующий подпараметр или на байт null ('\0') в конце строки (в случае, если последний подпараметр был только что обработан).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если в optionp распознан первый подпараметр, то getsubopt() возвращает индекс элемента в tokens найденного подпараметра. В противном случае возвращается -1 и значение *valuep указывает на целую строку name[=value].

Так как *optionp изменяется, первый подпараметр перед вызовом getsubopt() не (не всегда) тот же самый, что и первый подпараметр после getsubopt().

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

Интерфейс

Атрибут

Значение

getsubopt()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Так как getsubopt() заменяет запятые, найденные в строке *optionp, то строка должна быть доступна на запись; она не может быть строковой константой.

## ПРИМЕР
Следующая программа ожидает подпараметры после параметра «-o».

```
#define _XOPEN_SOURCE 500
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
int
main(int argc, char **argv)
{

    enum {

        RO_OPT = 0,

        RW_OPT,

        NAME_OPT

    };

    char *const token[] = {

        [RO_OPT]   = "ro",

        [RW_OPT]   = "rw",

        [NAME_OPT] = "name",

        NULL

    };

    char *subopts;

    char *value;

    int opt;

    int readonly = 0;

    int readwrite = 0;

    char *name = NULL;

    int errfnd = 0;

    while ((opt = getopt(argc, argv, "o:")) != -1) {

        switch (opt) {

        case 'o':

            subopts = optarg;

            while (*subopts != '\0' && !errfnd) {

            switch (getsubopt(&subopts, token, &value)) {

            case RO_OPT:

                readonly = 1;

                break;

            case RW_OPT:

                readwrite = 1;

                break;

            case NAME_OPT:

                if (value == NULL) {

                    fprintf(stderr, "Отсутствует значение для "

                            "подпараметра '%s'\n", token[NAME_OPT]);

                    errfnd = 1;

                    continue;

                }

                name = value;

                break;

            default:

                fprintf(stderr, "Совпадения не найдены "

                        "для токена: /%s/\n", value);

                errfnd = 1;

                break;

            }

        }

        if (readwrite && readonly) {

            fprintf(stderr, "Может указываться только одно из '%s' "

                    "и '%s'\n", token[RO_OPT], token[RW_OPT]);

            errfnd = 1;

        }

        break;

        default:

            errfnd = 1;

        }

    }

    if (errfnd || argc == 1) {

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

        fprintf(stderr, "возможны подпараметры: 'ro', 'rw', "

                "и 'name=<значение>'\n");

        exit(EXIT_FAILURE);

    }

    /* Остальная часть программы… */

    exit(EXIT_SUCCESS);
}
```

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


getttyent

package: man-pages-ru

title: getttyent(3)

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

text:
# getttyent(3)

## ИМЯ
getttyent, getttynam, setttyent, endttyent - возвращает запись из файла ttys

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

struct ttyent *getttyent(void);

struct ttyent *getttynam(const char *name);

int setttyent(void);

int endttyent(void);

## ОПИСАНИЕ
Эти функции предоставляют интерфейс к файлу из _PATH_TTYS (например, /etc/ttys).

Функция setttyent() открывает файл или сбрасывает указатель чтения на начало, если он уже открыт.

Функция endttyent() закрывает файл.

Функция getttynam() ищет заданное имя терминала в файле. Возвращается указатель на структуру ttyent (описана далее).

Функция getttyent() открывает файл из переменной _PATH_TTYS (если требуется) и возвращает его первую запись. Если файл уже открыт, то возвращается его следующая запись. Структура ttyent:

```
struct ttyent {

    char *ty_name;     /* имя устройства терминала */

    char *ty_getty;    /* команда для исполнения, обычно getty */

    char *ty_type;     /* тип терминала для termcap */

    int   ty_status;   /* флаги состояния */

    char *ty_window;   /* команда для запуска менеджера окон */

    char *ty_comment;  /* поле комментария */
};
```

Значением ty_status может быть:

```
#define TTY_ON     0x01  /* разрешить регистрации

                            (запускаемые программой ty_getty) */
#define TTY_SECURE 0x02  /* разрешить регистрацию с UID 0 */
```

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

Интерфейс

Атрибут

Значение

getttyent(), setttyent(), endttyent(), getttynam()

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

MT-Unsafe race:ttyent

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

## ЗАМЕЧАНИЯ
В Linux файл /etc/ttys и описанные выше функции не используются.

## СМОТРИТЕ ТАКЖЕ
ttyname(3), ttyslot(3)


getumask

title: getumask(3)

summary: возвращает маску создания файла

text:
# getumask(3)

## ИМЯ
getumask - возвращает маску создания файла

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

\#include <sys/types.h>

\#include <sys/stat.h>

mode_t getumask(void);

## ОПИСАНИЕ
Функция возвращает текущую маску создания файла. Она эквивалентна

```
mode_t getumask(void)
{

    mode_t mask = umask( 0 );

    umask(mask);

    return mask;
}
```

за исключением того, что без проблем может использоваться нитях (то есть использует общую блокировку с библиотечным вызовом umask(2)).

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

## ЗАМЕЧАНИЯ
Эта функция описана в руководстве glibc, но на момент версии glibc 2.24, оно не реализовано для Linux (смотрите в umask(2) нитебезопасный метод определения umask процесса).

## СМОТРИТЕ ТАКЖЕ
umask(2)


getusershell

title: getusershell(3)

summary: возвращают разрешённые оболочки

text:
# getusershell(3)

## ИМЯ
getusershell, setusershell, endusershell - возвращают разрешённые оболочки пользователя

## ОБЗОР

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

```
char *getusershell(void);
```

```
void setusershell(void);
```

```
void endusershell(void);
```

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

getusershell(), setusershell(), endusershell():

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

        _DEFAULT_SOURCE

    в glibc 2.19 и 2.20:

        _DEFAULT_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

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

        _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)
```

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

Функция setusershell() переходит к началу /etc/shells.

Функция endusershell() закрывает /etc/shells.

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

## ФАЙЛЫ

```
/etc/shells
```

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

Интерфейс

Атрибут

Значение

getusershell(), setusershell(), endusershell()

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

MT-Unsafe

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

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


getutent

title: getutent(3)

text:
# getutent(3)

## ИМЯ
getutent, getutid, getutline, pututline, setutent, endutent, utmpname - доступ к записям файла utmp

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

struct utmp *getutent(void);

struct utmp *getutid(const struct utmp *ut);

struct utmp *getutline(const struct utmp *ut);

struct utmp *pututline(const struct utmp *ut);

void setutent(void);

void endutent(void);

int utmpname(const char *file);

## ОПИСАНИЕ
В новых приложениях нужно использовать определённые в POSIX.1 «utmpx» версии этих функций; смотрите СООТВЕТСТВИЕ СТАНДАРТАМ.

Функция utmpname() задаёт имя файла в формате utmp для других функций utmp. Если utmpname() не используется для указания имени файла перед работой с другими функциями, то они будут использовать имя из _PATH_UTMP, определённое в <paths.h>.

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

Функция endutent() закрывает файл utmp. Она должна быть вызвана, когда будет завершена работа с файлом посредством других функций.

Функция getutent() считывает строку, начиная с текущей позиции файла в файле utmp. Она возвращает указатель на структуру, содержащую поля этой строки. Определение структуры приведено в utmp(5).

Функция getutid() производит прямой поиск, начиная с текущей позиции файла в файле utmp, основываясь на данных ut. Если значение ut->ut_type равно RUN_LVL, BOOT_TIME, NEW_TIME или OLD_TIME, то getutid() найдёт первую запись, поле ut_type которой совпадает с ut->ut_type. Если ut->ut_type равно INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS или DEAD_PROCESS, то getutid() найдёт первую запись, поле ut_id которой совпадает с ut->ut_id.

Функция getutline() производит прямой поиск, начиная с текущей позиции файла в файле utmp. Она просматривает записи, у которых поле ut_type совпадает с USER_PROCESS или LOGIN_PROCESS, и возвращает первую запись, поле ut_line которой совпадает с ut->ut_line.

Функция pututline() записывает структуру utmp ut в файл utmp. Для поиска места в файле, необходимого для вставки новой записи, используется getutid() . Если такое место не найдено, то pututline() добавит запись в конец файла.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функции getutent(), getutid() и getutline() возвращают указатель на struct utmp и NULL при ошибке (к ним относится и случай «запись не найдена»). Структура struct utmp располагается в статическом хранилище и может быть изменена последующими вызовами.

При успешном выполнении pututline() возвращает ut; при ошибке возвращается NULL.

При успешном назначении нового имени функция utmpname() возвращает 0 и -1 при ошибке.

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

## ОШИБКИ
ENOMEM

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

ESRCH

Запись не найдена.

Функции setutent(), pututline() и getut*() также могут завершиться с ошибкой по причинам, описанным в open(2).

## ФАЙЛЫ
/var/run/utmp

база данных пользователей, находящихся в системе в данный момент

/var/log/wtmp

база данных предыдущих пользовательских входов в систему

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

Интерфейс

Атрибут

Значение

getutent()

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

MT-Unsafe init race:utent race:utentbuf sig:ALRM timer

getutid(), getutline()

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

MT-Unsafe init race:utent sig:ALRM timer

pututline()

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

MT-Unsafe race:utent sig:ALRM timer

setutent(), endutent(), utmpname()

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

MT-Unsafe race:utent

В приведённой выше таблице utent в race:utent означает, что если в нескольких нитях программы одновременно используются функции setutent(), getutent(), getutid(), getutline(), pututline(), utmpname() или endutent(), то может возникнуть состязательность по данным.

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

Согласно XPG2 и SVID 2 функция pututline() возвращает тип void и такое поведение можно встретить во многих системах (AIX, HP-UX). В HP-UX представлена новая функция _pututline() с прототипом приведённым выше для pututline().

Эти функции являются устаревшими в не Linux системах. POSIX.1-2001 и POSIX.1-2008, следуя SUSv1, не содержит эти функции, вместо них используются

```
#include <utmpx.h>
```

```
struct utmpx *getutxent(void);
struct utmpx *getutxid(const struct utmpx *);
struct utmpx *getutxline(const struct utmpx *);
struct utmpx *pututxline(const struct utmpx *);
void setutxent(void);
void endutxent(void);
```

Эти функции предоставляются glibc и выполняют те же задачи что и их аналоги без «x»", но используют struct utmpx, определённую в Linux подобно struct utmp. Для завершённости, в glibc также есть utmpxname(), хотя эта функция отсутствует в POSIX.1.

В некоторых других системах структура utmpx представляет собой utmp с дополнительными полями и увеличенными размерами одинаковых полей, а также параллельно обслуживаются обе версии файлов, часто /var/*/utmpx и /var/*/wtmpx.

С другой стороны, в Linux glibc не используется второй файл utmpx, так как её структура utmp имеет достаточный размер. Функции с «x», перечисленные выше, являются просто псевдонимами их аналогов без «x» (например, getutxent() псевдоним getutent()).

## ЗАМЕЧАНИЯ

### Замечания по glibc
Перечисленные выше функции нельзя использовать в нескольких нитях одновременно. В glibc добавлены реентерабельные версии.

```
#include <utmp.h>
```

```
int getutent_r(struct utmp *ubuf, struct utmp **ubufp);
```

```
int getutid_r(struct utmp *ut,
              struct utmp *ubuf, struct utmp **ubufp);
```

```
int getutline_r(struct utmp *ut,
                struct utmp *ubuf, struct utmp **ubufp);
```

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

getutent_r(), getutid_r(), getutline_r():

```
    _GNU_SOURCE

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

    || /* glibc <= 2.19: */    _SVID_SOURCE || _BSD_SOURCE
```

Эти функции являются расширениями GNU, они аналогичны функциям с тем же именем без суффикса _r. В аргумент ubuf, передаваемый этим функциям, помещается результат. При успешном выполнении они возвращают 0 и указатель на результат записывается в *ubufp. При ошибке эти функции возвращают -1. Среди этих функций отсутствует эквиваленты utmpx (в POSIX.1 такие функции отсутствуют).

## ПРИМЕР
Нижеследующий пример добавляет и удаляет запись utmp, предполагается, что программа запущена с псевдотерминала. Для использования в реальном приложении необходимо проверять значения, возвращаемые getpwuid(3) и ttyname(3).

```
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <utmp.h>
#include <time.h>
int
main(int argc, char *argv[])
{

    struct utmp entry;

    system("echo перед добавлением записи:;who");

    entry.ut_type = USER_PROCESS;

    entry.ut_pid = getpid();

    strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));

    /* правильные имена ptys только /dev/tty[pqr][0-9a-z] */

    strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));

    time(&entry.ut_time);

    strcpy(entry.ut_user, getpwuid(getuid())->pw_name);

    memset(entry.ut_host, 0, UT_HOSTSIZE);

    entry.ut_addr = 0;

    setutent();

    pututline(&entry);

    system("echo после добавления записи:;who");

    entry.ut_type = DEAD_PROCESS;

    memset(entry.ut_line, 0, UT_LINESIZE);

    entry.ut_time = 0;

    memset(entry.ut_user, 0, UT_NAMESIZE);

    setutent();

    pututline(&entry);

    system("echo после удаления записи:;who");

    endutent();

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getutmp(3), utmp(5)


getutmp

title: getutmp(3)

text:
# getutmp(3)

## ИМЯ
getutmp, getutmpx - копирование структуры utmp в utmpx и наоборот

## ОБЗОР

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

```
 void getutmp(const struct utmpx *ux, struct utmp *u);
 void getutmpx(const struct utmp *u, struct utmpx *ux);
```

## ОПИСАНИЕ
Функция getutmp() копирует поля структуры utmpx, указанной в ux в соответствующие поля структуры utmp, указанной в u. Функция getutmpx() выполняет обратное действие.

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

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

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

Интерфейс

Атрибут

Значение

getutmp(), getutmpx()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В первую очередь, эти функции существуют для совместимости с другими системами, в которых структуры utmp и utmpx содержат разные поля или они разного размера. В Linux эти структуры содержат одинаковые поля и они одного размера.

## СМОТРИТЕ ТАКЖЕ
utmpdump(1), getutent(3), utmp(5)


getw

title: getw(3)

summary: ввод и вывод слов (int)

text:
# getw(3)

## ИМЯ
getw, putw - ввод и вывод слов (int)

## ОБЗОР

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

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

```
int putw(int w, FILE *stream);
```

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

getw(), putw():

Начиная с glibc 2.3.3:

_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)

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

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

До glibc 2.3.3:

_SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE

## ОПИСАНИЕ
Функция getw() читает слово (то есть, int) из stream. Она предоставляется для совместимости с SVr4. Вместо неё рекомендуется использовать fread(3).

Функция putw() записывает слово w (то есть, int) в stream. Она предоставляется для совместимости с SVr4; вместо неё рекомендуется использовать fwrite(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Обычно, getw() возвращает прочитанное слово, а putw() возвращает 0. При ошибках они возвращают EOF.

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

Интерфейс

Атрибут

Значение

getw(), putw()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SUSv2. Отсутствуют в POSIX.1.

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

## СМОТРИТЕ ТАКЖЕ
ferror(3), fread(3), fwrite(3), getc(3), putc(3)


getwchar

title: getwchar(3)

text:
# getwchar(3)

## ИМЯ
getwchar - считывает широкий символ из стандартного ввода

## ОБЗОР

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

```
wint_t getwchar(void);
```

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

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

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

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

Интерфейс

Атрибут

Значение

getwchar()

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

MT-Safe

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

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

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

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


glob

title: glob(3)

text:
# glob(3)

## ИМЯ
glob, globfree - ищет имена путей по шаблону, освобождает память после glob()

## ОБЗОР

```
#include <glob.h>
```

```
int glob(const char *pattern, int flags,
         int (*errfunc) (const char *epath, int eerrno),
         glob_t *pglob);
void globfree(glob_t *pglob);
```

## ОПИСАНИЕ
Функция glob() ищет все совпадения имён путей с заданным шаблоном pattern, согласно правилам, используемым оболочкой (смотрите glob(7)). Расширения тильды или подстановка параметров не выполняется; если это нужно, то используйте wordexp(3).

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

Результаты вызова glob() сохраняются в структуре, на которую указывает pglob. Эта структура имеет тип glob_t (объявлен в <glob.h>) и содержит следующие элементы, определённые в POSIX.2 (их может быть и больше, в виде расширений):

```
typedef struct {

    size_t   gl_pathc;    /* количество совпавших путей  */

    char   **gl_pathv;    /* список совпавших имён путей.  */

    size_t   gl_offs;     /* зарезервированные в gl_pathv слоты.  */
} glob_t;
```

Результаты размещаются в динамически выделяемом хранилище.

Значение параметра flags формируется побитовым сложением нуля или более следующих символических констант, которые меняют ход работы glob():

GLOB_ERR

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

GLOB_MARK

Добавлять косую черту к каждому пути, который соответствует каталогу.

GLOB_NOSORT

Не сортировать возвращаемые имена. Это экономит процессорное время. По умолчанию имена сортируются.

GLOB_DOOFFS

Резервировать слоты pglob->gl_offs у начала списка строк в pglob->pathv. Зарезервированные слоты содержат указатели null.

GLOB_NOCHECK

Если не найдено совпадений по шаблону, возвращать в качестве результата заданный шаблон. По умолчанию при отсутствии совпадений glob() возвращает GLOB_NOMATCH.

GLOB_APPEND

Добавлять результаты вызова к вектору результатов, полученному от предыдущего вызова glob(). Не следует включать этот флаг при первом вызове glob().

GLOB_NOESCAPE

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

В flags также могу быть включены следующие флаги, которые являются расширениями GNU и отсутствуют в POSIX.2:

GLOB_PERIOD

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

GLOB_ALTDIRFUNC

Для доступа к файловой системе использовать функции pglob->gl_closedir, pglob->gl_readdir, pglob->gl_opendir, pglob->gl_lstat и pglob->gl_stat вместо стандартных библиотечных функций.

GLOB_BRACE

Раскрывать выражения в фигурных скобках {a,b} аналогичны используемым в csh(1). Выражения могут быть вложенными. То есть, например, по шаблону "{foo/{,cat,dog},bar}" возвращаются те же результаты что и при четырёх отдельных вызовах glob() со строками: "foo/", "foo/cat", "foo/dog" и "bar".

GLOB_NOMAGIC

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

GLOB_TILDE

Выполнять расширения тильды. Если тильда ('~') — единственный символ в шаблоне или после начальной тильды сразу указана косая черта ('/'), то вместо тильды подставляется домашний каталог вызывающего Если после начальной тильды указано имя пользователя (например, "~andrea/bin"), то вместо тильды и имени пользователя подставляется домашний каталог этого пользователя. Если имя пользователя некорректно или домашний каталог невозможно определить, то подстановка не выполняется.

GLOB_TILDE_CHECK

Поведение подобно GLOB_TILDE. Отличие в том, что если имя пользователя некорректно или домашний каталог невозможно определить, то вместо использования самого шаблона как имени, glob() возвращает GLOB_NOMATCH для указания на ошибку.

GLOB_ONLYDIR

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

Если errfunc не равно NULL, то в случае ошибки она будет вызвана с параметрами epath (указатель на путь, в котором произошла ошибка) и eerrno (полученное значение errno после вызова одной из функций opendir(3), readdir(3) или stat(2)).Если errfunc вернёт ненулевое значение или если флаг GLOB_ERR установлен, то glob() закончит работу после вызова errfunc.

При успешном выполнении в pglob->gl_pathc содержится количество совпадающих имён, а pglob->gl_pathv содержит указатель на список указателей на найденные имена. Список указателей завершается указателем null.

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

Как расширение GNU, при обнаружении метасимволов pglob->gl_flags — набор задаваемых флагов, сложенный с GLOB_MAGCHAR (с помощью операции ИЛИ).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении glob() возвращает ноль. Другие возможные возвращаемые значения:

GLOB_NOSPACE

занята вся свободная память

GLOB_ABORTED

ошибка чтения

GLOB_NOMATCH

не найдено совпадений с шаблоном

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

Интерфейс

Атрибут

Значение

glob()

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

MT-Unsafe race:utent env sig:ALRM timer locale

globfree()

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

MT-Safe

В приведённой выше таблице utent в race:utent означает, что если любая из функций setutent(3), getutent(3) или endutent(3) используется одновременно в нескольких нитях программы, то может возникнуть состязательность по данным. Эти функции вызываются из glob(), поэтому мы используем race:utent для напоминания.

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

## ЗАМЕЧАНИЯ
Элементы структуры gl_pathc и gl_offs объявлены с типом size_t в glibc 2.1 (как и должны указываться, согласно POSIX.2), но указаны как int в glibc 2.0.

## ДЕФЕКТЫ
Функция glob() может завершиться с ошибкой из-за ошибок в используемых её функций: malloc(3) или opendir(3). Эти функции записывают коды своих ошибок в переменную errno.

## ПРИМЕР
Пример использования приводится ниже, в нём имитируется набор строки

```
ls -l *.c ../*.c
```

в оболочке:

```
glob_t globbuf;
globbuf.gl_offs = 2;
glob("*.c", GLOB_DOOFFS, NULL, &globbuf);
glob("../*.c", GLOB_DOOFFS | GLOB_APPEND, NULL, &globbuf);
globbuf.gl_pathv[0] = "ls";
globbuf.gl_pathv[1] = "-l";
execvp("ls", &globbuf.gl_pathv[0]);
```

## СМОТРИТЕ ТАКЖЕ
ls(1), sh(1), stat(2), exec(3), fnmatch(3), malloc(3), opendir(3), readdir(3), wordexp(3), glob(7)


title: gnu_get_libc_version(3)

summary: возвращают идентификатор версии

text:
# gnu_get_libc_version(3)

## ИМЯ
gnu_get_libc_version, gnu_get_libc_release - возвращают идентификатор версии и выпуска glibc

## ОБЗОР

```
#include <gnu/libc-version.h>
```

```
const char *gnu_get_libc_version(void);
const char *gnu_get_libc_release(void);
```

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

Функция gnu_get_libc_release() возвращает строку, которая описывает состояние выпуска версии glibc, установленной в системе. Обычно, возвращается строка stable.

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

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

Интерфейс

Атрибут

Значение

gnu_get_libc_version(), gnu_get_libc_release()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции есть только в glibc.

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

```
$ ./a.out
Версия GNU libc: 2.8
Выпуск GNU libc: stable
```

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

```
#include <gnu/libc-version.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{

    printf("Версия GNU libc: %s\n", gnu_get_libc_version());

    printf("Выпуск GNU libc: %s\n", gnu_get_libc_release());

    exit(EXIT_SUCCESS);
}
```

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


grantpt

title: grantpt(3)

text:
# grantpt(3)

## ИМЯ
grantpt - разрешает доступ для подчинённому псевдотерминалу

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

int grantpt(int fd);

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

grantpt():

начиная с glibc 2.24:

_XOPEN_SOURCE >= 500 ||

(_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)

glibc 2.23 и старее:

_XOPEN_SOURCE

## ОПИСАНИЕ
Функция grantpt() изменяет режим и владельца для устройства подчинённого псевдотерминала, соответствующего основному псевдотерминалу, на который ссылается fd. Идентификатор пользователя подчинённого устанавливается в действительный UID вызывающего процесса. Идентификатор группы устанавливается в неопределенное значение (например, tty). Права доступа к подчинённому псевдотерминала назначаются как 0620 (crw--w----).

Поведение grantpt() не определено, если установлен обработчик сигналов для перехвата сигналов SIGCHLD.

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

## ОШИБКИ
EACCES

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

EBADF

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

EINVAL

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

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

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

Интерфейс

Атрибут

Значение

grantpt()

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

MT-Safe locale

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

## ЗАМЕЧАНИЯ
Является частью поддержки псевдотерминалов UNIX 98 (смотрите pts(4)).

Многие системы реализуют эту функцию через вспомогательный исполняемый файл с установленным битом SUID, называемый «pt_chown». Благодаря файловой системе Linux devpts (начиная с Linux 2.2), ядро обычным образом устанавливает корректные значения владельца и права на подчинённый псевдотерминал когда открывается основной (posix_openpt(3)), поэтому grantpt() делать ничего не нужно. Таким образом, подобный вспомогательный файл не требуется ( и действительно, это значение пусто при сборке glibc, которая используется во многих системах).

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


title: group_member(3)

summary: проверяет присутствие процесса в группе

text:
# group_member(3)

## ИМЯ
group_member - проверяет присутствие процесса в группе

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

int group_member(gid_t gid);

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

group_member(): _GNU_SOURCE

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

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

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

## СМОТРИТЕ ТАКЖЕ
getgid(2), getgroups(2), getgrouplist(3), group(5)


gsignal

title: gsignal(3)

summary: программная фабрика сигналов

text:
# gsignal(3)

## ИМЯ
gsignal, ssignal - программная фабрика сигналов

## ОБЗОР

```
#include <signal.h>
```

```
typedef void (*sighandler_t)(int);
```

```
int gsignal(int signum);
```

```
sighandler_t ssignal(int signum, sighandler_t action);
```

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

gsignal(), ssignal():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_SVID_SOURCE

## ОПИСАНИЕ
Не используйте эти функции в Linux. Из-за исторической ошибки, в Linux эти функции являются псевдонимами raise(3) и signal(2), соответственно.

В остальных, System V-подобных системах, эти функции реализуют программные сигналы, абсолютно отличающиеся от классических вызовов signal(2) и kill(2). Функция ssignal() определяет действие при получении программного сигнала с номером signum, выполняемое функцией gsignal(), и возвращает предыдущее такое действие или SIG_DFL. Функция gsignal() делает следующее: если для сигнала signum не было определено действие (или оно SIG_DFL), то ничего не делается и возвращается 0. Если было определено действие SIG_IGN для signum, то ничего не делается и возвращается . Иначе, действие сбрасывается в SIG_DFL, вызывается функция действия с параметром signum, а также возвращается значение, возвращенное этой функцией. Диапазон возможных значений signum различен (часто он равен 1–15 или 1–17).

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

Интерфейс

Атрибут

Значение

gsignal()

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

MT-Safe

ssignal()

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

MT-Safe sigintr

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции доступны в AIX, DG-UX, HP-UX, SCO, Solaris, Tru64. Они определены, как устаревшие в большинстве этих систем, и некорректны в Linux libc и glibc. В некоторых системах также есть функции gsignal_r() и ssignal_r().

## СМОТРИТЕ ТАКЖЕ
kill(2), signal(2), raise(3)


hash

title: hash(3)

text:
# hash(3)

## ИМЯ
hash - метод доступа к базе данных ассоциативных массивов

## ОБЗОР

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

## ОПИСАНИЕ
Примечание: В этой странице описаны интерфейсы, предоставляемые glibc до версии 2.1. Начиная с версии 2.2, glibc больше не поддерживает эти интерфейсы. Вероятно, вы ищите API, предоставляемое библиотекой libdb.

Функция dbopen(3) — это библиотечный интерфейс к файлам баз данных. Один из поддерживаемых форматов файлов — hash. Общее описание методов доступа к базам данных находится в dbopen(3). Эта справочная страница содержит только информацию, относящуюся к ассоциативным массивам.

Структура данных ассоциативных массивов (хэш) расширяемая и динамична.

Специальная структура метода доступа данных, к которой обращается dbopen(3), задана в <db.h> следующим образом:

```
typedef struct {

    unsigned int       bsize;

    unsigned int       ffactor;

    unsigned int       nelem;

    unsigned int       cachesize;

    uint32_t         (*hash)(const void *, size_t);

    int         lorder;
} HASHINFO;
```

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

bsize

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

ffactor

указывает на желаемую плотность хэш-таблицы. Плотность — это максимальное количество ключей, которые могут находиться в одной корзине, определяющей, на какую величину увеличивается или уменьшается таблица. Значение по умолчанию — 8.

nelem

предполагаемый окончательный размер хэш-таблицы. Если значение не указано, или установлено слишком маленьким, то размер хэш-таблиц увеличивается каждый раз, когда добавляется новый ключ. Это может привести к снижению производительности. Значение по умолчанию — 1.

cachesize

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

hash

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

lorder

порядок байт для целых чисел, хранящихся в метаданных базы данных. Значение должно представлять порядок байт в виде целом числе, например, для прямого порядка (big endian) будет использовано значение 4321. Если lorder равно 0 (т. е. порядок не определён), то используется порядок байт машины. Если файл уже существует, то указываемое значение игнорируется и будет использоваться порядок байт, определённый при создании.

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

Если определена хэш-функция, то hash_open пытается определить, совпадает ли эта функция с той, что использовалась при создании файла, и завершается ошибкой, если это не так.

Обратно совместимый интерфейс, определённый в dbm(3) и ndbm(3), также существует, но он не совместим с предыдущими реализациями по формату файлов.

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

## ДЕФЕКТЫ
Поддерживаются значения только с прямым и обратным порядком байт.

## СМОТРИТЕ ТАКЖЕ
btree(3), dbopen(3), mpool(3), recno(3)

Dynamic Hash Tables, Per-Ake Larson, Communications of the ACM, April 1988.

A New Hash Package for UNIX, Margo Seltzer, USENIX Proceedings, Winter 1991.


hsearch

title: hsearch(3)

summary: операции над

text:
# hsearch(3)

## ИМЯ
hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - операции над ассоциативными массивами

## ОБЗОР

```
#include <search.h>
```

```
int hcreate(size_t nel);
```

```
ENTRY *hsearch(ENTRY item, ACTION action);
```

```
void hdestroy(void);
```

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

```
int hcreate_r(size_t nel, struct hsearch_data *htab);
```

```
int hsearch_r(ENTRY item, ACTION action, ENTRY **retval,
              struct hsearch_data *htab);
```

```
void hdestroy_r(struct hsearch_data *htab);
```

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

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

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

Функция hcreate_r() выполняет тоже, что и hcreate(), но для массива, описанного в структуре *htab. Перед вызовом hcreate_r() структура, на которую указывает htab, должна быть обнулена.

Функция hdestroy() освобождает память, занимаемую массивом, созданным hcreate(). После вызова hdestroy() функцией hcreate() можно создать новый массив. Функция hdestroy_r() выполняет аналогичную задачу для массива, описанного в *htab, который был ранее создан hcreate_r().

Функция hsearch() ищет в массиве элемент с ключом, равным item («равенство» определяется функцией strcmp(3)), и, в случае удачного завершения операции, возвращает указатель на него.

Аргумент item имеет тип ENTRY, который определён в <search.h> следующим образом:

```
typedef struct entry {

    char *key;

    void *data;
} ENTRY;
```

Поле key указывает на оканчивающуюся null строку, используемую в качестве ключа для поиска. Поле data указывает на данные, связанные с ключом.

Аргумент action определяет действие, выполняемое hsearch() после неудачного поиска. Его значением должно быть ENTER (указывает, что нужно вставить копию item и вернуть указатель на новый элемент массива) или FIND (нужно вернуть NULL). Если значение action равно FIND, то поле data игнорируется.

Функция hsearch_r() подобна hsearch(), но работает с массивом, указанным в *htab. Функция hsearch_r() отлична от hsearch() в том, что указатель найденного элемента возвращается в *retval, а не как результат работы функции.

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

Функция hsearch() при успешном выполнении возвращает указатель на элемент массива. При ошибке возвращается NULL, то есть, если action равно ENTER массив полон, или, если action равно FIND и item не может быть найден в массиве. Функция hsearch_r() возвращает 0 в случае ошибки или ненулевое значение при успешном выполнении. При ошибке данные функции присваивают errno код ошибки.

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

EINVAL

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

Функции hsearch() и hsearch_r() могут завершиться с ошибкой по следующим причинам:

ENOMEM

Значение action равно ENTER, значение key не найдено в массиве и в массиве нет места под новый элемент.

ESRCH

Значение action равно FIND и значение key не найдено в массиве.

В POSIX.1 определена только ошибка ENOMEM.

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

Интерфейс

Атрибут

Значение

hcreate(), hsearch(), hdestroy()

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

MT-Unsafe race:hsearch

hcreate_r(), hsearch_r(), hdestroy_r()

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

MT-Safe race:htab

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции hcreate(), hsearch() и hdestroy() взяты из SVr4 и описаны в POSIX.1-2001 и POSIX.1-2008.

Функции hcreate_r(), hsearch_r() и hdestroy_r() являются расширениями GNU.

## ЗАМЕЧАНИЯ
Реализации ассоциативных массивов более эффективны, если массив содержит достаточно свободного места, чтобы не искать незанятое пространство. Это означает, что обычно, значение nel нужно увеличить на, как минимум, 25% от максимального количества элементов, ожидаемых в массиве.

Функции hdestroy() и hdestroy_r() не освобождают буферы, на которые указывают элементы key и data в массиве (это невозможно сделать, так как неизвестно, были ли выделены эти буферы динамически). Если эти буферы требуется освобождать (возможно, из-за того, что программа много раз создаёт и удаляет массивы, а не создаёт один массив на всё время работы), то программа должна предусмотреть хранилище под используемые структуры, которое позволило бы их освободить.

## ДЕФЕКТЫ
В SVr4 и POSIX 1003.1-2001 указано, что action имеет смысл только при неудачном поиске, поэтому при ENTER не нужно ничего делать, если что-то найдено. В библиотеках libc и glibc (до версии 2.3) реализация функций обновляет data для указанного key в этом случае.

Можно добавлять элементы массива, но не удалять.

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

```
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
static char *data[] = { "alpha", "bravo", "charlie", "delta",

     "echo", "foxtrot", "golf", "hotel", "india", "juliet",

     "kilo", "lima", "mike", "november", "oscar", "papa",

     "quebec", "romeo", "sierra", "tango", "uniform",

     "victor", "whisky", "x-ray", "yankee", "zulu"
};
int
main(void)
{

    ENTRY e, *ep;

    int i;

    hcreate(30);

    for (i = 0; i < 24; i++) {

        e.key = data[i];

        /* data — это просто целое число, а не

           указатель на что-то */

        e.data = (void *) i;

        ep = hsearch(e, ENTER);

        /* здесь ошибки быть не должно */

        if (ep == NULL) {

            fprintf(stderr, "ошибка элемента\n");

            exit(EXIT_FAILURE);

        }

    }

    for (i = 22; i < 26; i++) {

        /* показать два элемента массива и

           два не из массива */

        e.key = data[i];

        ep = hsearch(e, FIND);

        printf("%9.9s -> %9.9s:%d\n", e.key,

               ep ? ep->key : "NULL", ep ? (int)(ep->data) : 0);

    }

    hdestroy();

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
bsearch(3), lsearch(3), malloc(3), tsearch(3)


hypot

title: hypot(3)

text:
# hypot(3)

## ИМЯ
hypot, hypotf, hypotl - функция, вычисляющая расстояния на евклидовой плоскости

## ОБЗОР

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

```
double hypot(double x, double y);
float hypotf(float x, float y);
long double hypotl(long double x, long double y);
```

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

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

hypot():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE

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

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

hypotf(), hypotl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

hypot(), hypotf(), hypotl()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
cabs(3), sqrt(3)


iconv

title: iconv(3)

summary: изменяет кодировку символов

text:
# iconv(3)

## ИМЯ
iconv - изменяет кодировку символов

## ОБЗОР

```
#include <iconv.h>
```

```
size_t iconv(iconv_t cd,
             char **inbuf, size_t *inbytesleft,
             char **outbuf, size_t *outbytesleft);
```

## ОПИСАНИЕ
Функция iconv() преобразует последовательность символов с одной кодировкой в последовательность символов с другой кодировкой. Аргумент cd должен быть дескриптором преобразования, созданным ранее с помощью функции iconv_open(3); дескриптор преобразования определяет кодировки символов, которые iconv() использует для преобразования. Аргумент inbuf содержит адрес переменной, которая указывает на первый символ входной последовательности; в inbytesleft содержится количество байт в этом буфере. В аргументе outbuf содержится адрес переменной, которая указывает на первый байт выходного буфера; в outbytesleft содержится количество байт в выходном буфере.

В основной рабочей ситуации значение inbuf не равно NULL и *inbuf не равно NULL. В этом случае функция iconv() преобразует многобайтовую последовательность с начала *inbuf, в многобайтовую последовательность с начала *outbuf. Максимальное количество считанных байт будет равно *inbytesleft, начиная с *inbuf. Максимальное количество записанных байт будет равно *outbytesleft, начиная с *outbuf.

Функция iconv() преобразует один многобайтовый символ за один раз и после каждого преобразования увеличивает *inbuf и уменьшает *inbytesleft на количество преобразованных входных байт, увеличивает *outbuf и уменьшает *outbytesleft на количество преобразованных выходных байт и обновляет состояние преобразования, содержащееся в cd. Если кодировка входных символов зависит от состояния, то функция iconv() также может преобразовать последовательность входных байт в простое обновление состояния преобразования без создания выходных байт; такие входные данные называются переключающей последовательностью. Процесс преобразования может прерваться в четырех случаях:

1.

Для обработки представлена неправильная многобайтная последовательность. В этом случае переменной errno присваивается значение EILSEQ и возвращается значение (size_t) -1. Значение *inbuf не меняется и указывает на начало неправильной многобайтной последовательности.

2.

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

3.

Неполная многобайтовая последовательность получена во входных данных и входная байтовая последовательность после неё заканчивается. В этом случае переменная errno устанавливается равной EINVAL и возвращается (size_t) -1. Значение *inbuf не меняется и указывает на начало неполной многобайтовой последовательности.

4.

В буфере вывода нет места для очередного преобразованного символа. В этом случае значение errno устанавливается равным E2BIG и возвращается (size_t) -1.

Особым случаем считается вариант, когда inbuf равно NULL или *inbuf равно NULL, но при этом outbuf не равно NULL и *outbuf не равно NULL. В этом случае функция iconv() пытается установить состояние преобразования cd в начальное состояние и сохранить переключающую последовательность в *outbuf. Максимальное количество записанных байтов будет равно *outbytesleft, начиная с *outbuf. Если в буфере вывода данных нет места для данной последовательности сброса, то переменная errno устанавливается равной E2BIG и возвращается (size_t) -1. В противном случае увеличивается *outbuf и уменьшается *outbytesleft на количество записанных байтов.

В третьем случае, когда inbuf равно NULL или *inbuf равно NULL, и outbuf равно NULL или *outbuf равно NULL, функция iconv() устанавливает состояние преобразования cd равным начальному состоянию.

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

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

E2BIG

Недостаточно места в *outbuf.

EILSEQ

Во входных данных находится неправильная многобайтовая последовательность.

EINVAL

Во входных данных находится неполная многобайтовая последовательность.

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

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

Интерфейс

Атрибут

Значение

iconv()

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

MT-Safe race:cd

Функцию iconv() можно использовать в нескольких нитях одновременно пока вызывающий не использует аргумент cd где-то ещё.

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

## ЗАМЕЧАНИЯ
В каждой последовательности вызовов iconv() у последнего значение inbuf или *inbuf должно быть равно NULL (для немедленного вывода остатка преобразованных данных).

Хотя inbuf и outbuf имеют тип char **, это не означает, что объекты, на которые они указывают, могут восприниматься как строки Си или массивы символов: реальное значение символьной последовательности байтов скрыто в преобразующих функциях. В некоторых кодировках нулевой байт может быть частью многобайтовой последовательности.

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

## СМОТРИТЕ ТАКЖЕ
iconv_close(3), iconv_open(3), iconvconfig(8)


title: iconv_close(3)

text:
# iconv_close(3)

## ИМЯ
iconv_close - освобождает дескриптор изменения кодировки символов

## ОБЗОР

```
#include <iconv.h>
```

```
int iconv_close(iconv_t cd);
```

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

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

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

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

Интерфейс

Атрибут

Значение

iconv_close()

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

MT-Safe

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

## СМОТРИТЕ ТАКЖЕ
iconv(3), iconv_open(3)


title: iconv_open(3)

text:
# iconv_open(3)

## ИМЯ
iconv_open - создаёт дескриптор преобразования кодировки набора символов

## ОБЗОР

```
#include <iconv.h>
```

```
iconv_t iconv_open(const char *tocode, const char *fromcode);
```

## ОПИСАНИЕ
Функция iconv_open() создаёт дескриптор, предназначенный для преобразования последовательности байтов с кодировкой fromcode в кодировку tocode.

Значения, допустимые для кодировок fromcode и tocode, и поддерживаемые комбинации, зависят от операционной системы. Для библиотеки GNU C разрешённые значения выводятся по команде iconv --list, а также поддерживаются все комбинации перечисленных значений. Кроме этого, библиотеки GNU C и GNU libiconv поддерживают два следующих суффикса:

//TRANSLIT

Если к tocode добавлена строка «//TRANSLIT», то включается транслитерация. Это означает, что когда символ не может быть представлен в целевом наборе символов, то он аппроксимируется одним или несколькими похожими символами.

//IGNORE

Если к tocode добавлена строка «//IGNORE», то символы, которые не могут быть представлены в целевом наборе символов, будут просто отбрасываться.

Полученный дескриптор преобразования может использоваться функцией iconv(3) любое количество раз. Он остается неизменным до тех пор, пока не будет освобождён функцией iconv_close(3).

Дескриптор преобразования содержит состояние перекодировки После создания с помощью функции iconv_open(), состояние равно начальному значению. Использование iconv(3) меняет состояние преобразования. Чтобы вернуть состояние в начальное значение, необходимо использовать функцию iconv(3) с параметром inbuf, равным NULL.

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

## ОШИБКИ
Среди прочих, может возникнуть следующая ошибка:

EINVAL

Преобразование из кодировки fromcode в tocode не поддерживается в данной реализации.

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

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

Интерфейс

Атрибут

Значение

iconv_open()

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

MT-Safe locale

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

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


title: if_nameindex(3)

summary: получает имена сетевых интерфейсов и

text:
# if_nameindex(3)

## ИМЯ
if_nameindex, if_freenameindex - получает имена сетевых интерфейсов и индексы

## ОБЗОР

```
#include <net/if.h>
```

```
struct if_nameindex *if_nameindex(void);
void if_freenameindex(struct if_nameindex *ptr);
```

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

```
unsigned int if_index; /* индекс интерфейса (1, 2, …) */
char        *if_name;  /* имя с Null в конце («eth0», и т. д.) */
```

В поле if_index содержится индекс интерфейса. Значение поля if_name указывает на имя интерфейса (завершается null). Конец массива определяется по записи if_index с нулевым значением и по записи if_name со значением NULL.

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

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

## ОШИБКИ
Функция if_nameindex() может завершиться с ошибкой и изменить errno если:

ENOBUFS

Недостаточно ресурсов.

Также функция if_nameindex() может завершиться с ошибками, перечисленными в socket(2), bind(2), ioctl(2), getsockname(2), recvmsg(2), sendto(2) или malloc(3).

## ВЕРСИИ
Впервые функция if_nameindex() появилась в glibc 2.1, но до glibc 2.3.4, реализация поддерживала только интерфейсы с адресами IPv4. Поддержка интерфейсов без адресов IPv4 доступна только в ядрах, поддерживающих netlink.

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

Интерфейс

Атрибут

Значение

if_nameindex(), if_freenameindex()

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

MT-Safe

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

Эта функция впервые появилась в BSDi.

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

```
$ ./a.out
1: lo
2: wlan0
3: em1
```

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

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

    struct if_nameindex *if_ni, *i;

    if_ni = if_nameindex();

    if (if_ni == NULL) {

        perror("if_nameindex");

        exit(EXIT_FAILURE);

    }

    for (i = if_ni; ! (i->if_index == 0 && i->if_name == NULL); i++)

        printf("%u: %s\n", i->if_index, i->if_name);

    if_freenameindex(if_ni);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getsockopt(2), setsockopt(2), getifaddrs(3), if_indextoname(3), if_nametoindex(3), ifconfig(8)


title: if_nametoindex(3)

summary: соответствие имён и индексов сетевых

text:
# if_nametoindex(3)

## ИМЯ
if_nametoindex, if_indextoname - соответствие имён и индексов сетевых интерфейсов

## ОБЗОР

```
#include <net/if.h>
```

```
unsigned int if_nametoindex(const char *ifname);
```

```
char *if_indextoname(unsigned int ifindex, char *ifname);
```

## ОПИСАНИЕ
Функция if_nametoindex() возвращает индекс сетевого интерфейса, соответствующего имени ifname.

Функция if_indextoname() возвращает имя сетевого интерфейса, соответствующего индексу интерфейса ifindex. Имя помещается в буфер, указанный в ifname. Буфер должен позволять хранить не менее IF_NAMESIZE байт.

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

При удачном завершении if_indextoname() возвращается ifname; при ошибке возвращается NULL, а значение errno устанавливается соответствующим образом.

## ОШИБКИ
Функция if_nametoindex() может завершиться с ошибкой и изменить errno если:

ENODEV

Не найден интерфейс с заданным именем.

Функция if_indextoname() может завершиться с ошибкой и изменить errno если:

ENXIO

Интерфейс по индексу не найден.

Также функции if_nametoindex() и if_indextoname() могут завершиться с ошибками, перечисленными в socket(2) или ioctl(2).

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

Интерфейс

Атрибут

Значение

if_nametoindex(), if_indextoname()

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

MT-Safe

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

Эта функция впервые появилась в BSDi.

## СМОТРИТЕ ТАКЖЕ
getifaddrs(3), if_nameindex(3), ifconfig(8)


ilogb

title: ilogb(3)

text:
# ilogb(3)

## ИМЯ
logb, logbf, logbl - получение целочисленной экспоненты значения числа с плавающей запятой

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

int ilogb(double x);

int ilogbf(float x);

int ilogbl(long double x);

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

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

ilogb():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

|| _XOPEN_SOURCE >= 500

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

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

ilogbf(), ilogbl(): _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

ilogb(), ilogbf(), ilogbl()

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

MT-Safe

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

## ДЕФЕКТЫ
До версии 2.16 в реализации этих функций в glibc существовали следующие дефекты:

- При ошибке области, когда x равно 0 или NaN, не изменялось значение errno или (на некоторых архитектурах) не возникало исключение неправильной плавающей запятой.

- При ошибке области, когда x равно бесконечности, не изменялось значение errno или не возникало исключение неправильной плавающей запятой.

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


index

title: index(3)

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

text:
# index(3)

## ИМЯ
index, rindex - находят местоположение символа в строке

## ОБЗОР

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

```
char *index(const char *s, int c);
```

```
char *rindex(const char *s, int c);
```

## ОПИСАНИЕ
Функция index() возвращает указатель на первый обнаруженный в строке s символ c.

Функция index() возвращает указатель на последний обнаруженный в строке s символ c.

Завершающий байт null ('\0') считается частью строки.

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

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

Интерфейс

Атрибут

Значение

index(), rindex()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.3BSD; в POSIX.1-2001 помечены как LEGACY. В POSIX.1-2008 спецификации index() и rindex() удалены, вместо них рекомендуется использовать strchr(3) и strrchr(3).

## СМОТРИТЕ ТАКЖЕ
memchr(3), strchr(3), string(3), strpbrk(3), strrchr(3), strsep(3), strspn(3), strstr(3), strtok(3)


inet

title: inet(3)

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

text:
# inet(3)

## ИМЯ
inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof - функции для работы с адресами Интернет

## ОБЗОР

```
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
```

```
int inet_aton(const char *cp, struct in_addr *inp);
```

```
in_addr_t inet_addr(const char *cp);
```

```
in_addr_t inet_network(const char *cp);
```

```
char *inet_ntoa(struct in_addr in);
```

```
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host);
```

```
in_addr_t inet_lnaof(struct in_addr in);
```

```
in_addr_t inet_netof(struct in_addr in);
```

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

inet_aton(), inet_ntoa():

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

        _DEFAULT_SOURCE

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

        _BSD_SOURCE || _BSD_SOURCE
```

## ОПИСАНИЕ
inet_aton() преобразует адрес Интернет-узла cp из числовой формы записи IPv4 с точками (IPv4 numbers-and-dots) в двоичную форму (с сетевым порядком байт) и сохраняет её в структуре, на которую ссылается inp. inet_aton() возвращает ненулевое значение, если адрес правильный, и ноль, если нет. Адрес, указанный в cp, может принимать одну из следующих форм:

a.b.c.d

Каждая из четырёх групп чисел представляет байт адреса; байты назначаются слева направо.

a.b.c

Части a и b задают первые два байта двоичного адреса. Часть c расценивается как 16-разрядное значение, определяющее два самых правых байта двоичного адреса. Такая запись совместима c сетевыми адресами (устаревшими) класса B.

a.b

Часть a определяет первый байт двоичного адреса. Часть b расценивается как 24-разрядное значение, определяющее три самых правых байта двоичного адреса. Данная форма записи совместима с сетевыми адресами (устаревшими) класса A.

a

Значение a расценивается как 32-разрядное значение, которое хранится в двоичном формате без какой либо перегруппировки байтов.

Во всех вышеперечисленные формах записи адресов числа могут быть указаны в десятичной, восьмеричной (с префиксом 0) или шестнадцатеричной (с префиксом 0X) системе счисления. Адреса, записанные в любой из этих форм, называются числовой формой записи IPv4 с точками. Форма записи, в которой используются только четыре десятичных числа, называется десятично-точечной записью IPv4 (IPv4 dotted-decimal notation) или иногда IPv4 dotted-quad notation.

Функция inet_aton() возвращает 1, если переданная строка была обработана успешно, или 0, если строка имеет некорректные данные (в errno ошибка не записывается).

Функция inet_addr() преобразует адрес Интернет-узла cp из числовой формы записи IPv4 с точками в двоичную форму с сетевым порядком байт. Если адрес, подаваемый на вход, неверный, функция возвращает INADDR_NONE (обычно -1). Использование этой функции проблематично, т.к. значение -1 эквивалентно корректному адресу (255.255.255.255). Избегайте использования этой функции, вместо нее используйте inet_aton(), inet_pton(3) или getaddrinfo(3), которые предоставляют более правильный способ указания на ошибку.

Функция inet_network() преобразует строку cp, записанную в числовой форме записи IPv4 с точками, в число (порядок байт узла), пригодное для использования в качестве сетевого адреса интернета. В случае успешного выполнения возвращается преобразованный адрес. В случае указания некорректной строки, возвращается -1.

Функция inet_ntoa() преобразует адрес Интернет-узла in, заданного в сетевом порядке байтов, в строку в числовой форме записи IPv4 с точками. Строка возвращается в статически выделяемом буфере, который перезаписывается при последующих вызовах.

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

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

Функция inet_makeaddr() противоположна inet_netof() и inet_lnaof(). Она возвращает адрес Интернет-узла в сетевом порядке байт, создавая его путём объединения номера сети net с номером узла host (оба задаются в порядке байт узла).

Структура in_addr, используемая в inet_ntoa(), inet_makeaddr(), inet_lnaof() и inet_netof(), определена в <netinet/in.h>:

```
typedef uint32_t in_addr_t;
struct in_addr {

    in_addr_t s_addr;
};
```

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

Интерфейс

Атрибут

Значение

inet_aton(), inet_addr(), inet_network(), inet_ntoa()

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

MT-Safe locale

inet_makeaddr(), inet_lnaof(), inet_netof()

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

MT-Safe

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

Функция inet_aton() не определена в POSIX.1, однако доступна в большинстве систем.

## ЗАМЕЧАНИЯ
В архитектурах x86 порядок байтов узла таков, что младший байт является первым (little endian = от младшего к старшему), а в сетевом порядке байт, который используется в интернет, старший байт является первым (big endian = от старшего к младшему).

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

Класс A

На данный тип адреса указывает 0 на месте старшего бита (сетевой порядок байтов) адреса. Сетевой адрес содержится в самом старшем байте, а адреса узлов занимают оставшиеся три байта.

Класс B

На данный тип адреса указывает двоичное значение 10 на месте двух самых старших битов (сетевой порядок байтов) адреса. Сетевой адрес содержится в двух старших байтах, а адреса узлов занимают оставшиеся два байта.

Класс C

На данный тип адреса указывает двоичное значение 110 на месте самых трех старших битов (сетевой порядок байтов) адреса. Сетевой адрес содержится в первых трёх старших байтах, а адреса узлов занимают оставшийся байт.

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

## ПРИМЕР
Ниже приведён код примера использования inet_aton() и inet_ntoa(). Рассмотрим результат работы примера:

```
$ ./a.out 226.000.000.037      # Последний байт в восьмеричной сс
226.0.0.31
$ ./a.out 0x7f.1               # Первый байт в шестнадцатеричной сс
127.0.0.1
```

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

```
#define _BSD_SOURCE
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

    struct in_addr addr;

    if (argc != 2) {

        fprintf(stderr, "%s <dotted-address>\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    if (inet_aton(argv[1], &addr) == 0) {

        fprintf(stderr, "Invalid address\n");

        exit(EXIT_FAILURE);

    }

    printf("%s\n", inet_ntoa(addr));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
byteorder(3), getaddrinfo(3), gethostbyname(3), getnameinfo(3), getnetent(3), inet_net_pton(3), inet_ntop(3), inet_pton(3), hosts(5), networks(5)


title: inet_net_pton(3)

summary: преобразует\ номер сети Интернета

text:
# inet_net_pton(3)

## ИМЯ
inet_net_pton, inet_net_ntop - преобразует номер сети Интернета

## ОБЗОР

```
#include <arpa/inet.h>
```

```
int inet_net_pton(int af, const char *pres,
                  void *netp, size_t nsize);
char *inet_net_ntop(int af, const void *netp, int bits,
                    char *pres, size_t psize);
```

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

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

inet_net_pton(), inet_net_ntop():

Начиная с glibc 2.20:

_DEFAULT_SOURCE

До glibc 2.20:

_BSD_SOURCE || _SVID_SOURCE

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

В обоих функциях в af задаётся адресное семейство для преобразования; поддерживается только значение AF_INET.

### inet_net_pton()
Функция inet_net_pton() преобразует pres, строку с null в конце, содержащую номер сети Интернета в представленческом формате, в сетевой формат. Результат преобразования с сетевым порядком байт помещается в буфер, указанный в net (аргумент netp, обычно, указывает на структуру in_addr). В аргументе nsize задаётся количество доступных байт в netp.

При успешном выполнении inet_net_pton() возвращает количество бит в поле номера сети результата, помещённого в netp. Обсуждение входного представленческого формата и возвращаемое значение смотрите в ЗАМЕЧАНИЯХ.

Замечание: буфер, указанный в netp, должен быть заполнен нулями до вызова inet_net_pton(), так как вызов изменяет только байты, необходимые для номера сети (или сколько явно указано в pres), что может быть меньше, чем байт в полном адресе сети.

### inet_net_ntop()
Функция inet_net_ntop() преобразует номер сети в буфере, указанном в netp, в представленческий формат; значение *netp рассматривается в сетевом порядке байт. В аргументе bits задаётся количество бит в номере сети из *netp.

Строка в представленческом формате с null в конце помещается в буфер, на который указывает pres. В аргументе psize задаётся количество байт, доступных в pres. Представленческая строка имеет формат CIDR: адрес сети в виде чисел, разделённых точками, затем косая черта и размер сети в битах.

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

При успешном выполнении inet_net_ntop() возвращается pres. При ошибке возвращается NULL, а в errno содержится код ошибки.

## ОШИБКИ
EAFNOSUPPORT

В af указано значение, отличное от AF_INET.

EMSGSIZE

Размер буфера результата недостаточен.

ENOENT

(inet_net_pton()) Значение pres имеет некорректный представленческий формат.

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

## ЗАМЕЧАНИЯ

### Представленческий формат входных данных inet_net_pton()
Номер сети может задаваться в виде шестнадцатеричного значения или в точечно-десятичной форме.

Шестнадцатеричное значение определяется по начальному «0x» или «0X». Шестнадцатеричные цифры заполняют полубайты (половина октета) номера сети слева направо в сетевом порядке байт.

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

a.b.c.d

a.b.c

a.b

a

Каждая часть — это число от 0 до 255, которое заполняет один байт получаемого номера сети; заполнение производится слева направо, в сетевом порядке байт (от старшего к младшему). Если часть пропущена, то байт результата в номере сети равно нулю.

В шестнадцатеричном или точечно-десятичном формате номер сети может содержать косую черту и число от 0 до 32, которое задаёт размер сети в битах.

### Возвращаемое значение inet_net_pton()
Возвращаемым значением inet_net_pton() является количество бит поля номера сети. Если входная строка представленческих данных заканчивается косой чертой и явным значением размера, то это значение является результатом inet_net_pton(). В противном случае возвращаемое значение, bits, определяется следующим образом:

- Если наиболее значимый байт номер сети больше или равен 240, то bits равно 32.

- Или же, если наиболее значимый байт номер сети больше или равен 224, то bits равно 4.

- Или же, если наиболее значимый байт номер сети больше или равен 192, то bits равно 24.

- Или же, если наиболее значимый байт номер сети больше или равен 128, то bits равно 16.

- В противном случае bits равно 8.

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

## ПРИМЕР
Программа, представленная далее, показывает использование inet_net_pton() и inet_net_ntop(). В ней используется inet_net_pton() для преобразования адреса сети из значения в представленческом формате, переданном в первом аргументе командной строки, в двоичную форму; выводится полученное из inet_net_pton() значение. Затем используется inet_net_ntop() для преобразования двоичной формы обратно в представленческий формат, и выводится полученная строка.

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

Пример работы, показывающий, как inet_net_pton() прогнозирует количество бит в номере сети:

```
$ ./a.out 193.168
inet_net_pton() вернула: 24
inet_net_ntop() выдала:  193.168.0/24
Необработанный адрес:              c1a80000
```

Демонстрируется, как inet_net_pton() не обнуляет неиспользованные байты в буфере результата:

```
$ ./a.out 193.168 0xffffffff
inet_net_pton() вернула: 24
inet_net_ntop() выдала:  193.168.0/24
Необработанный адрес:              c1a800ff
```

Демонстрируется, как inet_net_pton() расширяет прогнозируемый размер номера сети, если полученное количество байт в представленческой строке превышает прогнозируемое значение:

```
$ ./a.out 193.168.1.128
inet_net_pton() вернула: 32
inet_net_ntop() выдала:  193.168.1.128/32
Необработанный адрес:              c1a80180
```

Явно указанный размер номера сети заменяет любой прогнозируемый (но все дополнительные байты, указанные явно, всё равно будут использованы inet_net_pton() для заполнения буфера результата):

```
$ ./a.out 193.168.1.128/24
inet_net_pton() вернула: 24
inet_net_ntop() выдала:  193.168.1/24
Необработанный адрес:              c1a80180
```

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

```
/* Компоновать с «-lresolv» */
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \

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

    char buf[100];

    struct in_addr addr;

    int bits;

    if (argc < 2) {

        fprintf(stderr,

                "Использование: %s представленческая-форма \

                                   [начальное-значение-адреса]\n",

                argv[0]);

        exit(EXIT_FAILURE);

    }

    /* Если указан argv[2] (число), то использовать его для инициализации

       буфера результата, передаваемого inet_net_pton() для того, чтобы

       мы могли увидеть, что inet_net_pton() инициализирует только те

       байты, которые нужны для номера сети. Если argv[2] не указан, то

       буфер инициализируется нулями (как рекомендуется). */

    addr.s_addr = (argc > 2) ? strtod(argv[2], NULL) : 0;

    /* Преобразование представленческого формата номера сети

       из argv[1] в двоичный */

    bits = inet_net_pton(AF_INET, argv[1], &addr, sizeof(addr));

    if (bits == -1)

        errExit("inet_net_ntop");

    printf("inet_net_pton() вернула: %d\n", bits);

    /* Преобразование двоичного формата обратно в представленческий,

       используя значение «bits», возвращённое inet_net_pton() */

    if (inet_net_ntop(AF_INET, &addr, bits, buf, sizeof(buf)) == NULL)

        errExit("inet_net_ntop");

    printf("inet_net_ntop() выдала:  %s\n", buf);

    /* Показать «addr» в необработанном виде (в сетевом порядке байт)

       для того, чтобы мы могли увидеть байты, не отображаемые

       inet_net_ntop(); некоторые из этих байт могут быть не изменены

       inet_net_ntop(), и поэтому будут содержать любое начальное

       значение, которое было задано в argv[2]. */

    printf("Необработанный адрес:            %x\n", htonl(addr.s_addr));

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
inet(3), networks(5)


title: inet_ntop(3)

text:
# inet_ntop(3)

## ИМЯ
inet_ntop - преобразует адреса IPv4 и IPv6 из двоичного формата в текстовый вид

## ОБЗОР

```
#include <arpa/inet.h>
```

```
const char *inet_ntop(int af, const void *src,
                      char *dst, socklen_t size);
```

## ОПИСАНИЕ
Данная функция преобразует структуру сетевого адреса src с семейством адресов af в строку символов и копирует её в буфер по адресу dst, значение которого не должно быть равно NULL. В аргументе size вызывающий передаёт количество доступных байт в буфере.

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

AF_INET

Значение src указывает на структуру struct in_addr (с сетевым порядком байт), которая преобразуется в сетевой адрес IPv4 в точечно-десятичном формате «ddd.ddd.ddd.ddd». Буфер dst должен быть размером, по меньшей мере, INET_ADDRSTRLEN байт.

AF_INET6

Значение src указывает на структуру struct in6_addr (с сетевым порядком байт), которая преобразуется в сетевой адрес IPv6 наиболее подходящего формата для этого адреса. Буфер dst должен быть размером, по меньшей мере, INET6_ADDRSTRLEN байт.

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

## ОШИБКИ
EAFNOSUPPORT

Аргумент af не содержит допустимого значения семейства адресов.

ENOSPC

Строка с преобразованным адресом превышает размер, указанный в size.

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

Интерфейс

Атрибут

Значение

inet_ntop()

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

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008. Заметим, что в RFC 2553 определён прототип, в котором последний аргумент size имеет тип size_t. Многие системы следуют RFC 2553. В glibc 2.0 и 2.1 используется тип size_t, но в 2.2 и более новых версиях используется тип socklen_t.

## ДЕФЕКТЫ
Для семейства AF_INET6 IPv4-отображённые адреса IPv6 преобразуются в формат IPv6.

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

## СМОТРИТЕ ТАКЖЕ
getnameinfo(3), inet(3), inet_pton(3)


title: inet_pton(3)

text:
# inet_pton(3)

## ИМЯ
inet_pton - преобразует адреса IPv4 и IPv6 из текстового вида в двоичный формат

## ОБЗОР

```
#include <arpa/inet.h>
```

```
int inet_pton(int af, const char *src, void *dst);
```

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

В настоящее время поддерживаются следующие семейства адресов:

AF_INET

Значение src указывает на строку символов, содержащую сетевой адрес IPv4 в точечном формате «ddd.ddd.ddd.ddd», где ddd — десятичное число в диапазоне от 0 до 255, состоящее максимум из трёх цифр. Адрес преобразуется в struct in_addr и копируется в dst, размер которой должен быть равен sizeof(struct in_addr) (4) байтам (32 бита).

AF_INET6

Значение src указывает на строку символов, содержащую сетевой адрес IPv6. Адрес преобразуется в struct in6_addr и копируется в dst, размер которой должен быть равен sizeof(struct in6_addr) (16) байтам (128 бит). Допустимые форматы адресов IPv6:

1.

Предпочтительный формат — x:x:x:x:x:x:x:x. Он состоит из восьми шестнадцатеричных чисел, каждое из которых представляет 16-битное значение (т. е., каждый x может содержать до 4 шестнадцатеричных цифр).

2.

Серия непрерывных нулевых значений в предпочтительном формате может сокращённо записываться как ::. В адресе допускается только одно появление ::. Например, адрес интерфейса обратной петли 0:0:0:0:0:0:0:1 может быть сокращён до ::1. Шаблонный адрес, состоящий из всех нулей, может быть записан как ::.

3.

Альтернативный формат — полезен для записи IPv4-отображённых адресов IPv6. Этот формат имеет вид x:x:x:x:x:x:d.d.d.d, где шесть начальных x представляют собой шестнадцатеричные значения, которые определяют шесть наиболее значимых 16-битных частей адреса (т. е., 96 бит), а символами d выражается значение в точечно-десятичном формате, которое определяет наименее значимые 32 бита адреса. Пример адреса: ::FFFF:204.152.189.116.

Дополнительную информацию о представлении адресов IPv6 смотрите в RFC 2373.

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

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

Интерфейс

Атрибут

Значение

inet_pton()

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

MT-Safe locale

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

## ЗАМЕЧАНИЯ
В отличие от inet_aton(3) и inet_addr(3), inet_pton() поддерживает адреса IPv6. Но стоит отметить, что inet_pton() работает только с адресами IPv4 в точечно-десятичном формате, в то время как inet_aton(3) и inet_addr(3) поддерживают более распространённый формат чисел-с-точками (numbers-and-dots notation) (шестнадцатеричный и восьмеричный формат чисел, и форматы, которые не требуют явного указания всех четырёх байт). Программный интерфейс, который понимает одновременно адреса и IPv6, и IPv4 в формате чисел-с-точками, смотрите getaddrinfo(3).

## ДЕФЕКТЫ
При AF_INET6 не распознаются адреса IPv4. В этом случае в src должен указываться IPv4-отображённый адрес IPv6.

## ПРИМЕР
Представленная ниже программа показывает использование inet_pton() и inet_ntop(3). Пример работы программы:

```
$ ./a.out i6 0:0:0:0:0:0:0:0
::
$ ./a.out i6 1:0:0:0:0:0:0:8
1::8
$ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116
::ffff:204.152.189.116
```

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

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

    unsigned char buf[sizeof(struct in6_addr)];

    int domain, s;

    char str[INET6_ADDRSTRLEN];

    if (argc != 3) {

        fprintf(stderr,

          "Использование: %s {i4|i6|<число>} строка\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :

             (strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);

    s = inet_pton(domain, argv[2], buf);

    if (s <= 0) {

        if (s == 0)

            fprintf(stderr, "Неверный формат представления");

        else

            perror("inet_pton");

        exit(EXIT_FAILURE);

    }

    if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {

        perror("inet_ntop");

        exit(EXIT_FAILURE);

    }

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

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getaddrinfo(3), inet(3), inet_ntop(3)


initgroups

title: initgroups(3)

text:
# initgroups(3)

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

## ОБЗОР

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

```
int initgroups(const char *user, gid_t group);
```

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

initgroups():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE

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

Аргумент user должен быть не равен NULL.

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

## ОШИБКИ
ENOMEM

Недостаточно памяти для структуры с информацией о группе.

EPERM

Вызывающий процесс не имеет достаточно прав. Смотрите описание системного вызова setgroups(2).

## ФАЙЛЫ
/etc/group

файл базы данных групп

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

Интерфейс

Атрибут

Значение

initgroups()

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

MT-Safe locale

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

## СМОТРИТЕ ТАКЖЕ
getgroups(2), setgroups(2), credentials(7)


insque

title: insque(3)

summary: добавляет/удаляет элемент очереди

text:
# insque(3)

## ИМЯ
insque, remque - добавляет/удаляет элемент очереди

## ОБЗОР

```
#include <search.h>
```

```
void insque(void *elem, void *prev);
```

```
void remque(void *elem);
```

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

insque(), remque():

_XOPEN_SOURCE >= 500

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

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

## ОПИСАНИЕ
Функции insque() и remque() предназначены для управления двунаправленными списками (doubly-linked list). Каждый элемент такого списка представляет собой структуру, у которой первые два элемента являются указателями на следующий и предыдущий элементы. Двунаправленный список может быть линейным (linear), т.е. у последнего элемента списка указатель на следующий элемент равен NULL, а у первого элемента списка указатель на предыдущий элемент равен NULL, или закольцованным (circular).

Функция insque() вставляет элемент, на который указывает elem, сразу за элементом, на который указывает prev.

Если список линейный, то вызов insque(elem, NULL) можно использовать для вставки первого элемента списка; в этом случае значение указателей elem на следующий и предыдущий элементы устанавливается в NULL.

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

Функция remque() удаляет элемент, на который указывает elem из двунаправленного списка.

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

Интерфейс

Атрибут

Значение

insque(), remque()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
В старинных системах аргументы этих функций имеют тип struct qelem *:

```
struct qelem {

    struct qelem *q_forw;

    struct qelem *q_back;

    char          q_data[1];
};
```

Эта структура всё ещё доступна, если определить _GNU_SOURCE перед включением <search.h>.

Расположение прототипов этих функций отличается в разных версиях UNIX. Показанное выше — вариант POSIX. В некоторых системах они расположены в <string.h>.

## ДЕФЕКТЫ
В glibc 2.4 и старее нельзя было указать prev равным NULL. В результате, чтобы создать линейный список, вызывающий должен был указывать в первом вызове первые два элемента списка, в которых указатели на следующий и предыдущий элементы были заполнены правильным образом.

## ПРИМЕР
Представленная ниже программа показывает использование insque(). Пример работы программы:

```
$ ./a.out -c a b c
Обходим весь список:

    a

    b

    c
Это закольцованный список
```

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

```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <search.h>
struct element {

    struct element *forward;

    struct element *backward;

    char *name;
};
static struct element *
new_element(void)
{

    struct element *e;

    e = malloc(sizeof(struct element));

    if (e == NULL) {

        fprintf(stderr, "ошибка malloc()\n");

        exit(EXIT_FAILURE);

    }

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

    struct element *first, *elem, *prev;

    int circular, opt, errfnd;

    /* Параметр командной строки «-c» используется для указания,

       что это закольцованный список */

    errfnd = 0;

    circular = 0;

    while ((opt = getopt(argc, argv, "c")) != -1) {

        switch (opt) {

        case 'c':

            circular = 1;

            break;

        default:

            errfnd = 1;

            break;

        }

    }

    if (errfnd || optind >= argc) {

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

        exit(EXIT_FAILURE);

    }

    /* Создаём первый элемент и помещаем его в связный список */

    elem = new_element();

    first = elem;

    elem->name = argv[optind];

    if (circular) {

        elem->forward = elem;

        elem->backward = elem;

        insque(elem, elem);

    } else {

        insque(elem, NULL);

    }

    /* Добавляем оставшиеся аргументы командной строки как

       элементы списка */

    while (++optind < argc) {

        prev = elem;

        elem = new_element();

        elem->name = argv[optind];

        insque(elem, prev);

    }

    /* Обходим список с начала, выводя имена элементов */

    printf("Обходим весь список:\n");

    elem = first;

    do {

        printf("    %s\n", elem->name);

        elem = elem->forward;

    } while (elem != NULL && elem != first);

    if (elem == first)

        printf("Это закольцованный список\n");

    exit(EXIT_SUCCESS);
}
```

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


intro

title: intro(3)

summary: введение в библиотечные функции

text:
# intro(3)

## ИМЯ
intro - введение в библиотечные функции

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

Много функций этого раздела являются частью стандартной библиотеки C (libc). Некоторые функции находятся в других библиотеках (например, в математической библиотеке libm или библиотеке реального времени librt); в таких справочных страницах указывается параметр компоновщика для связывания с требуемой библиотекой (например, -lm и -lrt, соответственно, для вышеупомянутых библиотек).

В некоторых случаях программист должен определить макрос тестирования свойств, чтобы получить объявление функции из заголовочного файла, указанного в справочной странице в разделе СИНТАКСИС. (Где необходимо, эти макросы тестирования свойств должны быть определены перед включением какого-либо заголовочного файла.) В таких случаях требуемый макрос описан в справочной странице. Подробней о макросах тестирования свойств написано в feature_test_macros(7).

## СООТВЕТСТВИЕ СТАНДАРТАМ
Для обозначение вариантов UNIX и разнообразных стандартов, которым соответствуют системные вызовы, описанные в этом разделе, используются различные сокращения. См. standards(7).

## ЗАМЕЧАНИЯ

### Авторы и условия распространения
Авторы и условия распространения указаны в заголовке исходной справочной страницы. Заметим, что у разных страниц они могут быть разными! Список русских переводчиков для каждой страницы можно найти в .po файле в исходном коде пакета.

## СМОТРИТЕ ТАКЖЕ
intro(2), errno(3), capabilities(7), credentials(7), environ(7), feature_test_macros(7), libc(7), math_error(7), path_resolution(7), pthreads(7), signal(7), standards(7)