sysconf

title: sysconf(3)

text:
# sysconf(3)

## ИМЯ
sysconf - считывает информацию о настройках во время работы системы

## ОБЗОР

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

```
long sysconf(int name);
```

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

На стадии компиляции это осуществляется при помощи включения <unistd.h> и/или <limits.h> и проверки значений определённых макросов.

Во время выполнения можно запрашивать числовые значение посредством функции sysconf(). Можно запросить числовые значения, которые могут зависеть файловой системы, в которой находится файл, с помощью вызовов fpathconf(3) и pathconf(3). Строковые значения можно запрашивать с помощью confstr(3).

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

Для параметров, как правило, используются константы вида _POSIX_FOO, которые могут быть определены в <unistd.h>. Если параметр не определён, то его можно запросить во время выполнения. Если он определён со значением -1, то этот параметр не поддерживается. Если его значение равно 0, то соответствующие функции и заголовочные файлы существуют, но нужно во время выполнения запрашивать степень поддержки. Если он определён со значениями не -1 и 0, то параметр поддерживается. Обычно значение (например 200112L) отражает год и месяц версии POSIX, в которой описан параметр. В glibc используется значение 1, означающее, что поддержка в версии POSIX пока не опубликована. В этом случае аргумент sysconf() будет выглядеть как _SC_FOO. Список параметров смотрите в posixoptions(7).

Для переменных или ограничений, как правило, используются константы вида _FOO, возможно определённые в <limits.h>, или _POSIX_FOO, возможно определённые в <unistd.h>. Константа не будет определена, если не указано ограничение. Если константа определена, то это даёт гарантированное значение и в реальности может поддерживаться большее значение. Если приложение хочет получить преимущества учёта значений, которые могут быть разными в системах, то этого можно достичь с помощью sysconf(). В этом случае аргумент sysconf() будет выглядеть как _SC_FOO.

### Переменные POSIX.1
Далее показаны имя переменной, имя аргумента sysconf(), используемого для опроса этого значения, и короткое описание.

Сначала совместимые с POSIX.1 значения.

ARG_MAX - _SC_ARG_MAX

Максимально допустимая длина аргументов для семейства функций exec(3). Должна быть не меньше _POSIX_ARG_MAX (4096).

CHILD_MAX - _SC_CHILD_MAX

Максимально допустимое количество одновременно работающих процессов для каждого пользовательского ID. Должно быть не меньше _POSIX_CHILD_MAX (25).

HOST_NAME_MAX - _SC_HOST_NAME_MAX

Максимально допустимая длина имени узла (без завершающего null-байта), возвращаемая gethostname(2). Должна быть не меньше _POSIX_HOST_NAME_MAX (255).

LOGIN_NAME_MAX - _SC_LOGIN_NAME_MAX

Максимально допустимая длина имени пользователя (включая завершающий null-байт). Должна быть не меньше _POSIX_LOGIN_NAME_MAX (9).

NGROUPS_MAX - _SC_NGROUPS_MAX

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

такты часов - _SC_CLK_TCK

Количество тактов часов в секунду. Соответствующая переменная устарела. Ранее она называлась CLK_TCK (примечание: макрос CLOCKS_PER_SEC не даёт необходимую информацию, он должен быть равен 1000000).

OPEN_MAX - _SC_OPEN_MAX

Максимально допустимое количество файлов, которое одновременно может открыть процесс. Должно быть не меньше _POSIX_OPEN_MAX (20).

PAGESIZE - _SC_PAGESIZE

Размер страницы в байтах. Должен быть не меньше 1.

PAGE_SIZE - _SC_PAGE_SIZE

Синоним PAGESIZE/_SC_PAGESIZE (PAGESIZE и PAGE_SIZE определены в POSIX).

RE_DUP_MAX - _SC_RE_DUP_MAX

Количество повторяемых совпадений BRE, разрешённых regexec(3) и regcomp(3). Должно быть не меньше _POSIX2_RE_DUP_MAX (255).

STREAM_MAX - _SC_STREAM_MAX

Максимально допустимое количество потоков, которое может одновременно открывать процесс. Если определёно, то оно имеет то же значение, что и стандартный макрос C FOPEN_MAX. Должно быть не меньше _POSIX_STREAM_MAX (8).

SYMLOOP_MAX - _SC_SYMLOOP_MAX

Максимальное количество символических ссылок, допустимое при разрешении имени пути до того, как не будет возвращена ошибка ELOOP. Должно быть не меньше _POSIX_SYMLOOP_MAX (8).

TTY_NAME_MAX - _SC_TTY_NAME_MAX

Максимально допустимая длина имени устройства терминала, включая завершающий байт null. Должна быть не меньше _POSIX_TTY_NAME_MAX (9).

TZNAME_MAX - _SC_TZNAME_MAX

Максимально количество байт в имени часового пояса. Должно быть не меньше _POSIX_TZNAME_MAX (6).

_POSIX_VERSION - _SC_VERSION

Отображает год и месяц, в котором был утверждён стандарт POSIX.1, в формате YYYYMML; значение 199009L указывает на версию сентября 1990 года.

### Переменные POSIX.2
Далее перечислены значения POSIX.2, задающие ограничения для утилит.

BC_BASE_MAX - _SC_BC_BASE_MAX

Отображает максимальное значение obase, принимаемое утилитой bc(1).

BC_DIM_MAX - _SC_BC_DIM_MAX

Отображает максимальное количество элементов, разрешённых в массиве в bc(1).

BC_SCALE_MAX - _SC_BC_SCALE_MAX

Отображает максимальное значение scale, которое может принимать bc(1).

BC_STRING_MAX - _SC_BC_STRING_MAX

Отображает максимальную длину строки, которую может принимать bc(1).

COLL_WEIGHTS_MAX - _SC_COLL_WEIGHTS_MAX

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

EXPR_NEST_MAX - _SC_EXPR_NEST_MAX

Максимальное количество выражений, которые могут быть вложены внутри скобок expr(1).

LINE_MAX - _SC_LINE_MAX

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

RE_DUP_MAX - _SC_RE_DUP_MAX

Максимальное количество повторяемых совпадений регулярного выражения при указании интервала в нотации \{m,n\}

POSIX2_VERSION - _SC_2_VERSION

Отображает версию стандарта POSIX.2 в формате YYYYMML.

POSIX2_C_DEV - _SC_2_C_DEV

Отображает, поддерживаются ли средства разработки языка Си POSIX.2.

POSIX2_FORT_DEV - _SC_2_FORT_DEV

Отображает, поддерживаются ли средства разработки языка FORTRAN POSIX.2.

POSIX2_FORT_RUN - _SC_2_FORT_RUN

Отображает, поддерживаются ли утилиты времени выполнения языка FORTRAN POSIX.2.

_POSIX2_LOCALEDEF - _SC_2_LOCALEDEF

Отображает, поддерживается создание локалей с помощью localedef(1) согласно POSIX.2.

POSIX2_SW_DEV - _SC_2_SW_DEV

Отображает, поддерживаются ли параметры утилит разработки ПО POSIX.2.

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

- _SC_PHYS_PAGES

Количество страниц физической памяти. Заметим, что возможно переполнение при перемножении этого значения и _SC_PAGESIZE.

- _SC_AVPHYS_PAGES

Количество доступных в данный момент страниц физической памяти.

- _SC_NPROCESSORS_CONF

Количество настроенных процессоров. Смотрите также get_nprocs_conf(3).

- _SC_NPROCESSORS_ONLN

Количество включенных (доступных) процессоров. Смотрите также get_nprocs_conf(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращаемым значением sysconf() может быть одно из:

- При ошибке возвращается -1, а в errno содержится код ошибки (например, EINVAL означает, что некорректно name).

- Если name соответствует максимальному или минимальному ограничителю и этот ограничитель не определён, то возвращается -1 и errno не изменяется (чтобы отличать неопределённый ограничитель от ошибки, сбросьте errno в ноль пере вызовом, а затем проверьте, что errno не равно нулю, если возвращается -1).

- Если name соответствует параметру, то возвращается положительное значение, если параметр поддерживается и -1, если параметр не поддерживается.

- В противном случае возвращается текущее значение параметра или ограничителя. Это значение будет не более ограничивающем чем соответствующее значение, которое было показано приложению в <unistd.h> или <limits.h> при компиляции.

## ОШИБКИ
EINVAL

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

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

Интерфейс

Атрибут

Значение

sysconf()

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

MT-Safe env

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

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

Некоторые возвращаемые значения могут быть огромны; соответствующие им объекты невозможно разместить в памяти.

## СМОТРИТЕ ТАКЖЕ
bc(1), expr(1), getconf(1), locale(1), confstr(3), fpathconf(3), pathconf(3), posixoptions(7)


syslog

package: man-pages-ru

title: syslog(3)

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

text:
# syslog(3)

## ИМЯ
closelog, openlog, syslog, vsyslog - отправка сообщений в службу журналирования

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

void openlog(const char *ident, int option, int facility);

void syslog(int priority, const char *format, ...);

void closelog(void);

void vsyslog(int priority, const char *format, va_list ap);

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

vsyslog():

начиная с glibc 2.19:

_DEFAULT_SOURCE

glibc 2.19 и старее:

_BSD_SOURCE

## ОПИСАНИЕ

### openlog()
Функция openlog() открывает для программы соединение со службой журналирования.

Строка, на которую указывает ident, будет предварять каждое сообщение, обычно это имя программы. Если значение ident равно NULL, то используется имя программы (в POSIX.1-2008 не указано, что случается, если ident равно NULL).

В аргументе option указываются флаги, контролирующие действия openlog() и последующих вызовов syslog(). Аргумент facility устанавливает значения по умолчанию, если не будет указано другое в последующих вызовах syslog(). Значения для option и facility представлены ниже.

Использование openlog() не обязательно; она будет вызвана syslog() в случае необходимости (в этом случае по умолчанию ident будет установлено в NULL).

### syslog() и vsyslog()
Функция syslog() генерирует сообщение журнала, которое будет передавать syslogd(8).

Аргумент priority составляется из объединения значений facility и level (описано ниже). Если значения facility нет в priority, то по умолчанию используется значение, заданное openlog(), или, если до этого openlog() не вызывался, используется значение LOG_USER.

Оставшиеся аргументы — format, задаются в формате как у printf(3) (а также аргументы, необходимые для format) за исключением последовательности двух символов %m, которые заменяются строкой ошибки strerror(errno). В строку формата не нужно включать конечный символ новой строки.

Функция vsyslog() выполняет то же самое, что и syslog() с той лишь разницей, что она принимает набор аргументов, получаемых с использованием списка макросов stdarg(3).

### closelog()
Функция closelog() закрывает файловый дескриптор, использованный для записи в службу журналирования. Использование closelog() не обязательно.

### Значения option
Аргумент option у openlog() представляет собой битовую маску объединённых следующих значений:

LOG_CONS

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

LOG_NDELAY

Немедленно открыть соединение (обычно соединение открывается при первом сообщении). Например, это может быть полезно, если последующий chroot(2) делает недоступным путь, используемый внутри свойства протоколирования.

LOG_NOWAIT

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

LOG_ODELAY

Противоположен LOG_NDELAY; открытие подключения откладывается, пока не будет вызван syslog() (этот параметр используется по умолчанию, нет необходимости выставлять его вручную).

LOG_PERROR

(нет в POSIX.1-2001 или POSIX.1-2008) Также протоколировать сообщение в stderr.

LOG_PID

Включать PID вызывающего в каждое сообщение.

### Значения facility
Аргумент facility используется для указания типа программы, записывающей сообщение. Благодаря этому с помощью файла настройки можно по-разному обрабатывать сообщения от разных объектов.

LOG_AUTH

сообщения безопасности/авторизации

LOG_AUTHPRIV

сообщения безопасности/авторизации (private)

LOG_CRON

планировщик заданий (cron и at)

LOG_DAEMON

системные службы без определенного значения объекта

LOG_FTP

служба FTP

LOG_KERN

сообщения ядра (не могут быть созданы пользовательскими процессами)

с LOG_LOCAL0 по LOG_LOCAL7

зарезервировано для локального использования

LOG_LPR

подсистема печати

LOG_MAIL

почтовая подсистема

LOG_NEWS

подсистема новостей USENET

LOG_SYSLOG

сообщения, сгенерированные самой службой syslogd(8)

LOG_USER (по умолчанию)

обычные сообщения пользовательского уровня

LOG_UUCP

подсистема UUCP

### Значения level
Определяет важность сообщения. Ниже указаны уровни по уменьшению важности:

LOG_EMERG

система в нерабочем состоянии

LOG_ALERT

необходимо срочное вмешательство

LOG_CRIT

критические состояния

LOG_ERR

ошибки

LOG_WARNING

предупреждения

LOG_NOTICE

обычные, но важные сообщения

LOG_INFO

информационные сообщения

LOG_DEBUG

сообщения уровня отладки

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

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

Интерфейс

Атрибут

Значение

openlog(), closelog()

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

MT-Safe

syslog(), vsyslog()

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

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции openlog(), closelog() и syslog() (но не vsyslog()) определены в SUSv2, POSIX.1-2001 и POSIX.1-2008.

В POSIX.1-2001 для facility описаны только значения LOG_USER и LOG_LOCAL*. Однако, за исключением LOG_AUTHPRIV и LOG_FTP, остальные значения facility присутствуют в большинстве систем UNIX.

Значение LOG_PERROR для option не описано в POSIX.1-2001 или POSIX.1-2008, однако доступно в большинстве версий UNIX.

## ЗАМЕЧАНИЯ
Аргумент ident при вызове openlog() сохраняется как есть. Поэтому, если строка меняется, syslog() может начать добавлять уже изменённую строку. Если строка перестаёт существовать, то это может привести к непредвиденным результатам. Наиболее переносимый способ в данном случае — использовать строковую константу.

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

```
syslog(priority, "%s", string);
```

## СМОТРИТЕ ТАКЖЕ
journalctl(1), logger(1), setlogmask(3), syslog.conf(5), syslogd(8)

branch: sisyphus


system

title: system(3)

summary: выполняет команду оболочки (shell)

text:
# system(3)

## ИМЯ
system - выполняет команду оболочки (shell)

## ОБЗОР

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

```
int system(const char *command);
```

## ОПИСАНИЕ
В библиотечной функции system() используется fork(2) для создания процесса-потомка, в котором посредством execl(3) запускается команда оболочки, указанная в command:

```
execl("/bin/sh", "sh", "-c", command, (char *) NULL);
```

Функция system() возвращает результат после завершения работы команды.

На время выполнения команды SIGCHLD блокируется, а SIGINT и SIGQUIT игнорируются в процессе, который вызвал system() (эти сигналы будут обработаны их действиями по умолчанию внутри процесса-потомка, который выполняет command).

Если значение command равно NULL, то system() возвращает состояние, показывающее доступна ли оболочка в системе.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращаемым значением system() может быть одно из:

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

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

- Если оболочка не может выполниться в процессе-потомке, то возвращается значение будет таким же как если бы оболочка-потомок завершилась вызовом _exit(2) с состоянием 127.

- Если все системные вызовы выполнены без ошибок, то возвращается значение состояния завершения процесса-потомка, использовавшегося для выполнения command (состояние завершения оболочки — это состояние завершения последней выполнявшейся команды).

В последних двух случаях возвращаемое значение — это «состояние ожидания», которое можно определить с помощью макроса описанного в waitpid(2) (т. е., WIFEXITED(), WEXITSTATUS() и т. п.).

Функция system() не отражает состояние ожидание других потомков.

## ОШИБКИ
Функция system() может завершиться с теми же ошибками что и fork(2).

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

Интерфейс

Атрибут

Значение

system()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Функция system() проста и удобна: она позаботится обо всём для вызовов fork(2), execl(3) и waitpid(2), а также необходимых действиях с сигналами; также оболочка выполнит обычные подстановки и перенаправления ввода-вывода command. Но system() не эффективна: для создания процесса требуются дополнительные системные вызовы, которые запускают оболочку и выполняют команду.

Если определён макрос тестирования свойств _XOPEN_SOURCE (до включения всех заголовочных файлов), то при включении <stdlib.h> становятся доступны макросы, описанные в waitpid(2) (WEXITSTATUS() и т. п.).

Как уже упоминалось, функция system() игнорирует SIGINT и SIGQUIT. Это может привести к тому, что программы вызывающие её из цикла станут не прерываемыми, пока сами не проверят условия выхода для своих дочерних процессов. Пример:

```
while (something) {

    int ret = system("foo");

    if (WIFSIGNALED(ret) &&

        (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))

            break;
}
```

В POSIX.1 не определено, вызываются ли обработчики, зарегистрированные pthread_atfork(3), при выполнении system(). В реализации glibc такие обработчики не вызываются.

В версиях glibc до 2.1.3 проверка доступности /bin/sh в действительности не выполнялась, если значение command равно NULL; вместо этого всегда предполагалось наличие, и в этом случае system() всегда возвращала 1. Начиная с glibc 2.1.3, эта проверка выполняется, так как несмотря на требование POSIX.1-2001 a conforming implementation to provide a shell, that shell may not be available or executable if the calling program has previously called chroot(2) (which is not specified by POSIX.1-2001).

Существует вероятность, что команда оболочки возвратит значение 127, которое также является и возвращаемым значением самой system(); в этом случае нельзя понять, что невозможно выполнить оболочку в процессе-потомке.

### Предостережения
Не используйте system() в привилегированных программах (программы с set-user-ID или set-group-ID, или программы с мандатами), так как могут использоваться странные значения некоторых переменных окружения для разрушения целостности системы. Например, PATH может быть изменена так, что произвольная программа выполняется с расширенными правами. Вместо этого используйте семейство функций exec(3), но не execlp(3) или execvp(3) (которые также используют переменную окружения PATH для поиска исполняемого файла).

Функция system(), фактически, работает неправильно для программ с привилегиями set-user-ID или set-group-ID в системах, где /bin/sh это bash версии 2: для безопасности bash 2 при запуске убирает привилегии (в Debian используется другая оболочка, dash(1), которая не делает этого, если вызывается как sh).

Любой введённые пользователем данные, выполняемые как часть команды, должны быть внимательно отцензурированы так, чтобы не выполнились неожидаемые команды оболочки или параметры команды. Эти риски особенно серьезны при использовании system() из привилегированной программы.

## СМОТРИТЕ ТАКЖЕ
sh(1), execve(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7)


title: sysv_signal(3)

text:
# sysv_signal(3)

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

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

\#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t sysv_signal(int signum, sighandler_t handler);

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

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

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

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

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

Интерфейс

Атрибут

Значение

sysv_signal()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Избегайте использования sysv_signal(), используйте вместо неё sigaction(2).

В старых Linux-системах sysv_signal() и signal(2) были эквивалентны. Однако в новых системах signal(2) предоставляет надежную семантику сигналов. Подробности смотрите в signal(2).

Используемый параметр sighandler_t является расширением GNU; данный тип определён только в том случае, если определён макрос _GNU_SOURCE.

## СМОТРИТЕ ТАКЖЕ
sigaction(2), signal(2), bsd_signal(3), signal(7)


tan

title: tan(3)

summary: функция тангенса

text:
# tan(3)

## ИМЯ
tan, tanf, tanl - функция тангенса

## ОБЗОР

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

```
double tan(double x);
float tanf(float x);
long double tanl(long double x);
```

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

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

tanf(), tanl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

## ОПИСАНИЕ
Эти функции возвращают тангенс от x, где x указан в радианах.

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

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

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

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

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

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

tan(), tanf(), tanl()

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

MT-Safe

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

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

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

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


tanh

title: tanh(3)

summary: функция гиперболического тангенса

text:
# tanh(3)

## ИМЯ
tanh, tanhf, tanhl - функция гиперболического тангенса

## ОБЗОР

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

```
double tanh(double x);
float tanhf(float x);
long double tanhl(long double x);
```

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

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

tanhf(), tanhl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

```
    tanh(x) = sinh(x) / cosh(x)
```

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

tanh(), tanhf(), tanhl()

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

MT-Safe

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

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

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


tcgetpgrp

title: tcgetpgrp(3)

text:
# tcgetpgrp(3)

## ИМЯ
tcgetpgrp, tcsetpgrp - возвращает и задаёт терминал активной группы процессов

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

pid_t tcgetpgrp(int fd);

int tcsetpgrp(int fd, pid_t pgrp);

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

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

Если tcsetpgrp() вызывается членом группы фоновых процессов в этом сеансе, и вызывающий процесс не блокирует или игнорирует SIGTTOU, то сигнал SIGTTOU отправляется всем членам этой группы фоновых процессов.

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

При успешном выполнении tcsetpgrp() возвращает 0. Иначе возвращается -1 и переменная errno устанавливается соответствующим образом.

## ОШИБКИ
EBADF

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

EINVAL

Неподдерживаемое значение pgrp.

ENOTTY

Вызывающий процесс не имеет управляющего терминала, или он имеется, но не описан fd, или, для tcsetpgrp(), этот управляющий терминал больше не связан с сеансом вызывающего процесса.

EPERM

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

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

Интерфейс

Атрибут

Значение

tcgetpgrp(), tcsetpgrp()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Эти функции реализованы через вызовы ioctl TIOCGPGRP и TIOCSPGRP.

### История
Эти вызовы ioctl появились в 4.2BSD. Функции являются изобретениями POSIX.

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


tcgetsid

title: tcgetsid(3)

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

text:
# tcgetsid(3)

## ИМЯ
tcgetsid - возвращает идентификатор сеанса

## ОБЗОР
\#define _XOPEN_SOURCE 500 /* см. feature_test_macros(7) */

\#include <termios.h>

pid_t tcgetsid(int fd);

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

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

## ОШИБКИ
EBADF

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

ENOTTY

Вызвавший процесс не имеет управляющего терминала или fd не ссылается на имеющийся управляющий терминал.

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

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

Интерфейс

Атрибут

Значение

tcgetsid()

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

MT-Safe

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

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

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


telldir

title: telldir(3)

text:
# telldir(3)

## ИМЯ
telldir - возвращает текущее положение в потоке каталога

## ОБЗОР

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

```
long telldir(DIR *dirp);
```

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

telldir():

_XOPEN_SOURCE

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

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

## ОПИСАНИЕ
Функция telldir() возвращает текущее положение, связанное с потоком каталога dirp.

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

## ОШИБКИ
EBADF

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

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

Интерфейс

Атрибут

Значение

telldir()

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

MT-Safe

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

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

В старых файловых системах возвращаемое telldir() значение было просто файловым смещением в каталоге. В современных файловых системах для представления каталогов используются структуры деревьев или хэшей, а не плоские таблицы. В таких файловых системах значение, возвращаемое telldir() (и используемое внутри readdir(3)) — некая «подсказка», которая используется реализацией для получения позиции в каталоге. Прикладные программы должны считать это значение «чёрным ящиком» и не делать предположений о его содержимом.

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


tempnam

title: tempnam(3)

summary: создаёт имя для временного файла

text:
# tempnam(3)

## ИМЯ
tempnam - создаёт имя для временного файла

## ОБЗОР

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

```
char *tempnam(const char *dir, const char *pfx);
```

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

tempnam():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Никогда не используйте эту функцию. Вместо неё используйте mkstemp(3) или tmpfile(3).

Функция tempnam() возвращает указатель на строку, которая является допустимым именем файла и при этом файл с подобным именем на момент проверки tempnam() не существует. Суффикс сгенерированного имени файла будет начинаться с pfx (при условии, что pfx — не NULL-строка и содержит не менее пяти байт). Также необходимо, чтобы префикс, состоящий из имён каталогов полного имени файла, был «целесообразным» (чаще всего это подразумевает, как минимум, доступность на запись).

Попытка найти подходящий каталог делится на следующие шаги:

1.

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

2.

Иначе, если аргумент dir не является NULL и подходящий, то используется он.

3.

Иначе используется P_tmpdir (описана в <stdio.h>), если она подходит.

4.

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

Память под строку, возвращаемую tempnam(), выделяется с помощью malloc(3) и в последствии должна быть освобождена с помощью free(3).

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

## ОШИБКИ
ENOMEM

Не удалось выделить память для строки.

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

Интерфейс

Атрибут

Значение

tempnam()

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

MT-Safe env

## СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.3BSD, POSIX.1-2001. В POSIX.1-2008 функция tempnam() отмечена как устаревшая.

## ЗАМЕЧАНИЯ
Хотя tempnam() генерирует имена, которые трудно подобрать, тем не менее, есть вероятность, что за промежуток времени, когда tempnam() вернёт имя файла и программа откроет его, другая программа успеет создать такое же имя с помощью open(2) или создать символическую ссылку, что может привести к проблемам безопасности. Чтобы исключить подобную вероятность, для открытия имени файла используйте open(2) с флагом O_EXCL. А ещё лучше — воспользуйтесь mkstemp(3) или tmpfile(3).

В SUSv2 не упоминается использование TMPDIR; в glibc она будет использоваться только в том случае, если у программы не установлен бит set-user-ID. В SVr4, используемый каталог для случая 4. — /tmp (как и для glibc).

Так как tempnam() динамически выделяет память под возвращаемое имя файла, то она является реентерабельной и, следовательно, безопасной при использовании нитей (в отличие от tmpnam(3)).

Функция tempnam() генерирует уникальное имя каждый раз, пока не достигнет предела TMP_MAX (определённого в <stdio.h>). Если она будет вызвана более чем TMP_MAX раз, то дальнейшее поведение определяется конкретной реализацией.

tempnam() использует по крайней мере первые пять байт из pfx.

Реализация tempnam() из glibc завершается ошибкой EEXIST, если не сможет найти уникальное имя.

## ДЕФЕКТЫ
Точного определения «целесообразности» не существует. Не определено, каким образом должна определяться доступность каталога.

## СМОТРИТЕ ТАКЖЕ
mkstemp(3), mktemp(3), tmpfile(3), tmpnam(3)


termios

title: termios(3)

text:
# termios(3)

## ИМЯ
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed - возвращает и задаёт атрибуты терминала, управляет линией, возвращает и задаёт скорость передачи

## ОБЗОР

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

```
int tcgetattr(int fd, struct termios *termios_p);
```

```
int tcsetattr(int fd, int optional_actions,
              const struct termios *termios_p);
```

```
int tcsendbreak(int fd, int duration);
```

```
int tcdrain(int fd);
```

```
int tcflush(int fd, int queue_selector);
```

```
int tcflow(int fd, int action);
```

```
void cfmakeraw(struct termios *termios_p);
```

```
speed_t cfgetispeed(const struct termios *termios_p);
```

```
speed_t cfgetospeed(const struct termios *termios_p);
```

```
int cfsetispeed(struct termios *termios_p, speed_t speed);
```

```
int cfsetospeed(struct termios *termios_p, speed_t speed);
```

```
int cfsetspeed(struct termios *termios_p, speed_t speed);
```

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

cfsetspeed(), cfmakeraw():

начиная с glibc 2.19:

_DEFAULT_SOURCE

glibc 2.19 и старее:

_BSD_SOURCE

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

### Структура termios
Множество описанных здесь функций имеют аргумент termios_p, который является указателем на структуру termios. В этой структуре есть, по крайней мере, следующие поля:

```
tcflag_t c_iflag;      /* режимы ввода */
tcflag_t c_oflag;      /* режимы вывода */
tcflag_t c_cflag;      /* режимы управления */
tcflag_t c_lflag;      /* локальные режимы */
cc_t     c_cc[NCCS];   /* специальные символы */
```

Значения этих полей описаны далее. Для первых четырёх полей битовых масок определения некоторых флагов доступны только, если определён специальный макрос тестирования свойств (смотрите feature_test_macros(7)), как указано в квадратных скобках («[]»).

В описаниях ниже приписка «нет в POSIX» означает, что значение не описано в POSIX.1-2001, а «XSI» — что значение описано в POSIX.1-2001 как часть расширения XSI.

Константы флага c_iflag:

IGNBRK

Игнорировать состояние BREAK в вводе.

BRKINT

Если указан IGNBRK, то BREAK игнорируется. Если он не указан, а BRKINT указан, то BREAK вызывает сброс (flushed) очередей ввода и вывода, и, если терминал является управляющим для активной (foreground) группы процессов, то этой группе посылается сигнал SIGINT. Если IGNBRK и BRKINT не указаны, то BREAK считывается как байт null («\0»), кроме случая, когда указан PARMRK, тогда он будет прочитан как последовательность \377 \0 \0.

IGNPAR

Игнорировать ошибки кадра и чётности.

PARMRK

Если этот бит установлен, то входящие байты с ошибками чётности или кадра помечаются при передаче в программу. Этот бит значим, только когда установлен бит INPCK и не установлен бит IGNPAR. Байты с ошибками помечаются двумя предваряющими их байтами \377 и \0. То есть программа, на самом деле, читает три байта при получении одного байта с ошибками с терминала. Если корректный байт имеет значение \377 и бит ISTRIP (смотрите далее) не установлен, то программа может ошибочно посчитать его как помечающий ошибки чётности. Поэтому в этом случае корректный байт \377 передаётся программе как два байта, \377 \377.

Если IGNPAR или PARMRK не указаны, то символ с ошибкой чётности или кадра считывается как \0.

INPCK

Включить проверку чётности ввода.

ISTRIP

Удалять восьмой бит.

INLCR

Преобразовывать NL в CR в вводе.

IGNCR

Игнорировать возврат каретки в вводе.

ICRNL

Преобразовывать возврат каретки в символ новой строки в вводе (если не указан IGNCR).

IUCLC

(нет в POSIX) Переводить заглавные буквы в прописные в вводе.

IXON

Включить управление потоком XON/XOFF в выводе.

IXANY

(XSI) Набор любого символа запускает остановленный вывод (по умолчанию только символ START заново запускает вывод).

IXOFF

Включить управление потоком XON/XOFF в вводе.

IMAXBEL

(нет в POSIX) Выдавать звуковой сигнал, когда очередь ввода переполняется. В Linux не реализован этот бит и его действие выполняется всегда.

IUTF8 (начиная с Linux 2.6.4)

(нет в POSIX) Ввод в UTF8; это позволяет символу стирания (character-erase) правильно работать в режиме предварительной обработки (cooked mode).

Константы флага c_oflag:

OPOST

Включить обработку вывода, определяемую реализацией.

OLCUC

(нет в POSIX) Переводить прописные буквы в заглавные в выводе.

ONLCR

(XSI) Преобразовывать NL в CR-NL в выводе.

OCRNL

Преобразовывать CR в NL в выводе.

ONOCR

Не выводить CR в столбец 0.

ONLRET

Не выводить CR.

OFILL

Посылать символы заполнения для задержки, а не использовать временную задержку.

OFDEL

Символ заполнения ASCII DEL (0177). Если не указано, то используется ASCII NUL («\0») (не реализовано в Linux).

NLDLY

Маска задержки новой строки. Значениями могут быть NL0 и NL1 [требуется _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

CRDLY

Маска задержки перевода каретки. Значениями могут быть CR0, CR1, CR2 или CR3 [требуется _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

TABDLY

Маска задержки горизонтальной табуляции. Значениями могут быть TAB0, TAB1, TAB2, TAB3 (или XTABS, но смотрите раздел BUGS). Значение TAB3, то есть, XTABS, раскрывает табуляцию в пробелы (один символ табуляции — восемь столбцов) [требуется _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

BSDLY

Маска задержки символа забоя. Значениями могут быть BS0 или BS1 (никогда не была реализована) [требуется _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

VTDLY

Маска задержки вертикальной табуляции. Значениями могут быть VT0 или VT1.

FFDLY

Маска задержки прокрутки страницы. Значениями могут быть FF0 или FF1 [требуется _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

Константы флага c_cflag:

CBAUD

(нет в POSIX) Маска скорости в бодах (4+1 бита) [требуется _BSD_SOURCE или _SVID_SOURCE].

CBAUDEX

(нет в POSIX) Дополнительная маска скорости в бодах (1 бит), включена в CBAUD [требуется _BSD_SOURCE или _SVID_SOURCE].

В стандарте POSIX указано, что скорость в бодах хранится в структуре termios без указания её точного местонахождения, и для работы к ней используются cfgetispeed() и cgfsetispeed(). В некоторых системах используются биты, выбираемые CBAUD в c_cflag, в других используются отдельные поля, например sg_ispeed и sg_ospeed.

CSIZE

Маска размера символа. Значениями могут быть CS5, CS6, CS7 или CS8.

CSTOPB

Использовать два стоповых бита вместо одного.

CREAD

Включить приёмник.

PARENB

Запустить генерацию чётности при выводе и проверку чётности на вводе.

PARODD

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

HUPCL

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

CLOCAL

Игнорировать управляющие линии модема.

LOBLK

(нет в POSIX) Блокировать вывод из не текущего уровня оболочки (для использования в shl (shell layers), не реализовано в Linux).

CIBAUD

(нет в POSIX) Маска скоростей ввода. Для битов CIBAUD используются те же значения, что и для битов CBAUD, но они смещены влево на ISHIFT битов [требуется _BSD_SOURCE или _SVID_SOURCE] (не реализовано в Linux).

CMSPAR

(нет в POSIX) Использовать «липкую» (есть/нет) чётность (поддерживается в некоторых последовательных устройствах): если задан PARODD, то бит чётности всегда 1; если PARODD не задан, то бит чётности всегда 0 [требуется _BSD_SOURCE или _SVID_SOURCE].

CRTSCTS

(нет в POSIX) Разрешить (аппаратное) управление потоком данных RTS/CTS [требуется _BSD_SOURCE или _SVID_SOURCE].

Константы флага c_lflag:

ISIG

При получении символов INTR, QUIT, SUSP или DSUSP генерировать соответствующий сигнал.

ICANON

Включить канонический режим (описан далее).

XCASE

(нет в POSIX; не поддерживается в Linux) Если также указан ICANON, то терминал работает только с символами в верхнем регистре. Ввод преобразуется в символы нижнего регистра, кроме символов, предваряемых \. При выводе предваряемые \ символы в верхнем регистре и символы в нижнем регистре преобразуются в символы верхнего регистра [requires _BSD_SOURCE, _SVID_SOURCE или _XOPEN_SOURCE].

ECHO

Отображать вводимые символы.

ECHOE

Если также указан ICANON, то символ ERASE стирает предыдущий введённый символ, а WERASE стирает предыдущее слово.

ECHOK

Если также указан ICANON, то символ KILL стирает текущую строку.

ECHONL

Если также указан ICANON, то символ NL отображается, даже если не указан ECHO.

ECHOCTL

(нет в POSIX) Если также указан ECHO, то специальные символы терминала, кроме TAB, NL, START и STOP, отображаются как ^X, где X — символ из таблицы ASCII с кодом на 0x40 больше, чем у специального символа. Например, символ 0x08 (BS) отобразится как ^H [требуется _BSD_SOURCE или _SVID_SOURCE].

ECHOPRT

(нет в POSIX) Если также указаны ICANON и IECHO, то символы печатаются по мере того, как они стираются [требуется _BSD_SOURCE или _SVID_SOURCE].

ECHOKE

(нет в POSIX) Если также указан ICANON, то KILL выводится стиранием каждого символа в строке, как задано ECHOE и ECHOPRT [требуется _BSD_SOURCE или _SVID_SOURCE].

DEFECHO

(нет в POSIX) Выводить (echo) только в момент чтения процессом (не реализовано в Linux).

FLUSHO

(нет в POSIX; не поддерживается в Linux) Выводимые данные сбрасываются (flushed). Этот флаг переключается с помощью набираемого символа DISCARD [требуется _BSD_SOURCE или _SVID_SOURCE].

NOFLSH

Отключить сброс (flushing) очередей ввода и вывода во время генерации сигналов из-за символов INT, QUIT и SUSP.

TOSTOP

Послать сигнал SIGTTOU группе процессов фонового процесса, который пытается писать на управляющий терминал.

PENDIN

(нет в POSIX; не поддерживается в Linux) Все символы в очереди ввода повторно печатаются, когда читается последующий символ (это используется в bash(1) для перехвата набираемого) [требуется _BSD_SOURCE или _SVID_SOURCE].

IEXTEN

Включить обработку ввода, определяемую реализацией. Этот флаг, как и ICANON, должен быть включён для обработки специальных символов EOL2, LNEXT, REPRINT, WERASE, а также для того, чтобы работал флаг IUCLC.

Массивом c_cc определяются специальные символы терминала. Символьные индексы (начальные значения) и их смысл:

VDISCARD

(нет в POSIX; не поддерживается в Linux; 017, SI, Ctrl-O) Переключатель: включить/выключить отбрасывание ожидающего вывода. Распознаётся, если указан IEXTEN и, в этом случае, не передаётся как ввод.

VDSUSP

(нет в POSIX; не поддерживается в Linux; 031, EM, Ctrl-Y) Символ отложенного приостанова (DSUSP). Посылает сигнал SIGTSTP при считывании символа программой пользователя. Распознаётся, если указаны IEXTEN и ISIG, и система поддерживает управление заданиями. В этом случае не передаётся как ввод.

VEOF

(004, EOT, Ctrl-D) Символ конца файла (EOF). Этот символ заставляет переслать ждущий обработки буфер tty ожидающей программе пользователя без ожидания конца строки. Если это первый символ в строке, то read(2) вернёт программе 0, что означает конец файла. Распознаётся, если указан ICANON, и, в этом случае, не передаётся как ввод.

VEOL

(0, NUL) Дополнительный символ конца строки (EOL). Распознаётся, если указан ICANON.

VEOL2

(нет в POSIX; 0, NUL) Ещё один символ конца строки (EOL2). Распознаётся, если указан ICANON.

VERASE

(0177, DEL, rubout, или 010, BS, Ctrl-H, а также #) Символ забоя (ERASE). Стирает предыдущий ещё не стёртый символ, но не стирает за EOF или началом строки. Распознаётся, если указан ICANON, и, в этом случае, не передаётся как ввод.

VINTR

(003, ETX, Ctrl-C, а также 0177, DEL, rubout) Символ прерывания (INTR). Посылает сигнал SIGINT. Распознаётся, если указан ISIG, и, в этом случае, не передаётся как ввод.

VKILL

(025, NAK, Ctrl-U, или Ctrl-X, а также @) Символ уничтожения (KILL). Стирает ввод начиная с последнего EOF или начала строки. Распознаётся, если указан ICANON, и, в этом случае, не передаётся как ввод.

VLNEXT

(нет в POSIX; 026, SYN, Ctrl-V) Следующий символ — литера (LNEXT). Экранирует следующий введённый символ, отменяя его возможное специальное значение. Распознаётся, если указан IEXTEN и, в этом случае, не передаётся как ввод.

VMIN

Минимальное количество символов для неканонического чтения (MIN).

VQUIT

(034, FS, Ctrl-\) Символ завершения (QUIT). Посылает сигнал SIGQUIT. Распознаётся, если указан ISIG, и, в этом случае, не передаётся как ввод.

VREPRINT

(нет в POSIX; 022, DC2, Ctrl-R) Вывести заново непрочитанные символы (REPRINT). Распознаётся, если указан ICANON и IEXTEN и, в этом случае, не передаётся как ввод.

VSTART

(021, DC1, Ctrl-Q) Символ запуска (START). Перезапускает вывод, остановленный символом останова. Распознаётся, если указан IXON и, в этом случае, не передаётся как ввод.

VSTATUS

(нет в POSIX; не поддерживается в Linux; запрос состояния: 024, DC4, Ctrl-T). Символ состояния (STATUS). Выводит информацию о состоянии на терминал, включая состояние активного (foreground) процесса и количество потраченного времени ЦП. Также посылает сигнал SIGINFO (не поддерживается в Linux) активной группе процессов.

VSTOP

(023, DC3, Ctrl-S) Символ останова (STOP). Приостанавливает вывод до появления символа запуска. Распознаётся, если указан IXON и, в этом случае, не передаётся как ввод.

VSUSP

(032, SUB, Ctrl-Z) Символ приостанова (SUSP). Посылает сигнал SIGTSTP. Распознаётся, если указан ISIG и, в этом случае, не передаётся как ввод.

VSWTCH

(нет в POSIX; не поддерживается в Linux; 0, NUL) Символ переключения (SWTCH). Используется в System V для переключения оболочек в слоях оболочек, предшественник механизма управления задачами в оболочке.

VTIME

Время ожидания в децисекундах для неканонического чтения (TIME).

VWERASE

(нет в POSIX; 027, ETB, Ctrl-W) Стирание слова (WERASE). Распознаётся, если указан ICANON и IEXTEN и, в этом случае, не передаётся как ввод.

Отдельные специальные терминальные символы могут быть выключены указанием значения _POSIX_VDISABLE в соответствующем элементе c_cc.

Все значения индексов этих символов различны, за исключением VTIME, VMIN, которые могут иметь те же значения, что и VEOL, VEOF, соответственно. В неканоническом режиме значения специальных символов используются как значения времени ожидания. Предназначение VMIN и VTIME смотрите в описании неканонического режима далее.

### Получение и изменение настроек терминала
Функция tcgetattr() возвращает параметры, связанные с объектом, на который ссылается fd, сохраняя их в структуре termios, на которую указывает termios_p. Эта функция может быть вызвана из фонового процесса; однако, атрибуты терминала могут в дальнейшем измениться активным процессом.

Функция tcsetattr() изменяет параметры терминала (если это позволяет используемое оборудование) из структуры termios, на которую указывает termios_p. В optional_actions задаётся, когда параметры должны начать действовать:

TCSANOW

Изменения начинают действовать немедленно.

TCSADRAIN

Изменения начинают действовать после того, как переданы все данные для вывода, записанные в fd. Это действие должно использоваться при работе с параметрами, которые влияют на вывод.

TCSAFLUSH

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

### Канонический и неканонический режим
Флагом ICANON в c_lflag определяется, в каком режиме работает терминал: в каноническом режиме (ICANON установлен), и неканоническом (ICANON не установлен). По умолчанию ICANON установлен.

В каноническом режиме:

- Вводимые данные становятся доступны построчно. Входная строка становится доступна после набора одного из разделителей строк (NL, EOL, EOL2 или EOF в начале строки). За исключением EOF, разделитель строк добавляется в буфер, возвращаемый read(2).

- Включено редактирование строки (ERASE, KILL; и, если указан флаг IEXTEN — WERASE, REPRINT, LNEXT). Вызов read(2) возвращает не более одной строки ввода; если read(2) запрашивает меньше байт, чем доступно в текущей вводимой строке, то читается только количество запрошенных байт, а оставшиеся символы будут доступны для следующего read(2).

- Максимальная длина строки - 4096 символов (включая завершающий символ перевода строки); строки длиннее 4096 символов будут обрезаны. После 4095 символов обработка ввода (то есть обработка ISIG и ECHO*) продолжится, однако любые входящие данные после 4095 символов до (но не включая) любого завершающего символа новой строки будут отбрасываться. Благодаря этому терминал всегда сможет принять больше входящих данных до тех пор, пока не появится хотя бы один перевод строки.

В неканоническом режиме вводимые данные доступны сразу (без введённого пользователем символа разделителя строк), обработка ввода не выполняется и редактирование строки выключено. Буфер чтения принимает только 4095 символов; благодаря этому, в случае, если режим ввода переключится в канонический, резервируется необходимое место для символа новой строки. Настройками MIN (c_cc[VMIN]) и TIME (c_cc[VTIME]) задаются условия, при которых выполняется read(2); есть четыре варианта:

MIN == 0, TIME == 0 (чтение опросом (polling read))

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

MIN > 0, TIME == 0 (блокирующее чтение)

Вызов read(2) блокирует выполнение, пока не будет доступно MIN байт, и возвращает не более количества запрашиваемых байт.

MIN == 0, TIME > 0 (чтение с блокировкой по времени (read with timeout))

В TIME указывается время срабатывания таймера в десятых долях секунды. Таймер запускается при вызове read(2). Вызов read(2) завершается, когда не менее одного байта станет доступно, или когда сработает таймер. Если таймер сработал, а данных не появилось, то read(2) возвращает 0. Если на момент вызова read(2) данные уже были, то вызов действует так, как если бы данные были получены сразу после вызова.

MIN > 0, TIME > 0 (чтение с блокировкой по времени между байтами (read with interbyte timeout))

В TIME указывается время срабатывания таймера в десятых долях секунды. После того, как первый байт станет доступен, таймер перезапускается после каждого полученного байта. Вызов read(2) возвращает результат после удовлетворения любого из следующих условий:

- Было получено MIN байт.

- Истекло время межбайтового таймера.

- Получено запрошенное read(2) количество байт (в POSIX нет этого условия завершения, и в некоторых реализациях read(2) не возвращает управление в этом случае).

Так как таймер запускается только после приёма начального байта, будет прочитан, как минимум, один байт. Если на момент вызова read(2) данные уже были, то вызов действует так, как если бы данные были получены сразу после вызова.

В POSIX не указано, имеет ли флаг состояния файла O_NONBLOCK приоритет над настройками MIN и TIME. Если O_NONBLOCK установлен, то read(2) в неканоническом режиме может вернуть управление сразу же, независимо от настройки MIN или TIME. Более того, если данных нет, то в POSIX разрешено read(2) в неканоническом режиме вернуть или 0, или -1 с установкой errno равной EAGAIN.

### Режим без обработки
Функция cfmakeraw() переводит терминал в нечто похожее на режим «raw» старого драйвера терминала Version 7: ввод доступен символ за символом, эхо отключено и все специальные обработки символов при вводе и выводе также отключены. Задаются следующие атрибуты терминала:

```
termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP

                | INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
```

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

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

Функция tcdrain() ждёт, пока все данные вывода, записанные в объект, на который ссылается fd, не будут переданы.

Функция tcflush() отбрасывает (discards) данные, записанные, но не переданные в объект, на который ссылается fd, или принятые, но не прочитанные (в зависимости от значения queue_selector):

TCIFLUSH

Отбросить принятые, но не прочитанные данные.

TCOFLUSH

Отбросить записанные, но не переданные данные.

TCIOFLUSH

Отбросить принятые, но не прочитанные данные и записанные, но не переданные данные.

Функция tcflow() задерживает передачу или приём данных объектом, на который ссылается fd (в зависимости от значения action):

TCOOFF

Задержать вывод.

TCOON

Возобновить задержанный вывод.

TCIOFF

Передать символ STOP, который останавливает передачу данных в систему с устройства терминала.

TCION

Передать символ START, который начинает передачу данных в систему с устройства терминала.

По умолчанию при открытии файла терминала ни ввод, ни вывод не приостановлены.

### Скорость линии
Функции работы со скоростью передачи (в бодах) предназначены для получения и установки значений скоростей ввода и вывода в структуре termios. Новые значения не действуют, пока не будет вызвана tcsetattr().

При установке скорости B0 модему передаётся команда «повесить трубку». Фактическая скорость, соответствующая B38400, может быть изменена с помощью setserial(8).

Скорости ввода и вывода хранятся в структуре termios.

Функция cfgetospeed() возвращает скорость вывода данных, хранящуюся в структуре termios, на которую указывает termios_p.

Функция cfsetospeed() устанавливает скорость вывода данных из поля speed структуры termios, на которую указывает termios_p. Значение должно быть равно одной из следующих констант:

```
	B0
	B50
	B75
	B110
	B134
	B150
	B200
	B300
	B600
	B1200
	B1800
	B2400
	B4800
	B9600
	B19200
	B38400
	B57600
	B115200
	B230400
```

Нулевая скорость, B0, используется для завершения соединения. Если указана B0, то линии управления модемом не должны больше отслеживаться. Обычно это обрывает связь на линии. CBAUDEX — это маска скоростей, которые выше определённых в POSIX.1 (57600 и выше). Таким образом, B57600 & CBAUDEX не равно нулю.

Функция cfgetispeed() возвращает скорость ввода данных, хранящуюся в структуре termios.

Функция cfsetispeed() устанавливает значение скорости ввода данных из поля speed структуры termios. Значение должно быть равно одной из констант Bnnn, перечисленных выше для cfsetospeed(). Если скорость ввода данных устанавливается равной нулю, то скорость ввода данных будет равна скорости вывода данных.

Функция cfsetspeed() является расширением 4.4BSD. Она имеет те же аргументы что и cfsetispeed(), и задаёт сразу скорость и ввода и вывода.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция cfgetispeed() возвращает скорость ввода данных, хранящуюся в структуре termios.

Функция cfgetospeed() возвращает скорость вывода данных, хранящуюся в структуре termios.

Все остальные функции возвращают:

0

при успешном выполнении.

-1

при ошибках и errno присваивается код ошибки.

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

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

Интерфейс

Атрибут

Значение

tcgetattr(), tcsetattr(), tcdrain(), tcflush(), tcflow(), tcsendbreak(), cfmakeraw(), cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed(), cfsetspeed()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функции tcgetattr(), tcsetattr(), tcsendbreak(), tcdrain(), tcflush(), tcflow(), cfgetispeed(), cfgetospeed(), cfsetispeed() и cfsetospeed() определены в POSIX.1-2001.

Функций cfmakeraw() и cfsetspeed() нет в стандарте, но есть в BSD.

## ЗАМЕЧАНИЯ
В UNIX V7, а также в некоторых более новых системах, имеется список скоростей в бодах, где после первых четырнадцати значений B0, …, B9600, идут две константы EXTA и EXTB («External A» и «External B»). Многие другие системы расширяют этот список более высокими значениями скоростей.

Ненулевое значение duration с tcsendbreak() приводит к неизвестному результату. В SunOS задана пауза duration * N секунд, где N равно не менее 0.25, и не более 0.5. В Linux, AIX, DU, Tru64 делается пауза в duration миллисекунд. В FreeBSD и NetBSD и HP-UX и MacOS значение duration игнорируется. В Solaris и UnixWare функция tcsendbreak() с ненулевым duration работает аналогично tcdrain().

## ДЕФЕКТЫ
На архитектуре Alpha до Linux 4.16 (и glibc до версии 2.28), значение XTABS отличалось от TAB3 и в результате игнорировалось кодом протокола линии N_TTY в драйвере терминала (так как он не являлся частью маски TABDLY).

## СМОТРИТЕ ТАКЖЕ
reset(1), setterm(1), stty(1), tput(1), tset(1), tty(1), ioctl_console(2), ioctl_tty(2), setserial(8)


tgamma

title: tgamma(3)

summary: вычисление настоящей гамма\-функции

text:
# tgamma(3)

## ИМЯ
tgamma, tgammaf, tgammal - вычисление настоящей гамма-функции

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

double tgamma(double x);

float tgammaf(float x);

long double tgammal(long double x);

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

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

tgamma(), tgammaf(), tgammal():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Эти функции вычисляют гамма-функцию от x.

Гамма-функция определяется так:

Gamma(x) = integral from 0 to infinity of t^(x-1) e^-t dt

Она определена для всех действительных чисел кроме не положительных целых. Для не положительных интеграл m получим

Gamma(m+1) = m!

и, в общем случае, для всех x:

Gamma(x+1) = x * Gamma(x)

Кроме это, допустимы все значения x вне особых точек:

Gamma(x) * Gamma(1 - x) = PI / sin(PI * x)

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

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

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

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

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

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

Если x равно -0 или +0, то генерируется ошибка особой точки, а функции возвращают HUGE_VAL, HUGE_VALF или HUGE_VALL, соответственно, с тем же знаком что и 0.

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

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

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

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

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

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

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

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

В glibc также возникает следующая ошибка, которая не определена в C99 или POSIX.1-2001:

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

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

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

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

Интерфейс

Атрибут

Значение

tgamma(), tgammaf(), tgammal()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Эта функция называется «настоящей гамма-функцией» (true gamma function), так как уже есть функция gamma(3), возвращающая совершенно другое значение (смотрите gamma(3)).

## ДЕФЕКТЫ
До версии 2.18 реализации этих функций в glibc при возникновении ошибки потери значимости не присваивали errno значение ERANGE.

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

В glibc версии 2.3.3 и старее при значении +0 или -0 некорректно возникает ошибка области (errno присваивается EDOM и возникает исключение FE_INVALID), а не ошибка особой точки.

## СМОТРИТЕ ТАКЖЕ
gamma(3), lgamma(3)


timegm

title: timegm(3)

summary: обратные gmtime и localtime функции

text:
# timegm(3)

## ИМЯ
timegm, timelocal - обратные gmtime и localtime функции

## ОБЗОР

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

```
time_t timelocal(struct tm *tm);
```

```
time_t timegm(struct tm *tm);
```

```

```

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

timelocal(), timegm():

начиная с glibc 2.19:

_DEFAULT_SOURCE

glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
timelocal() и timegm() являются обратными функциями по отношению к localtime(3) и gmtime(3). Обе функции принимают разделенное на составные части время и преобразуют его в календарное (измеряемое в секундах от начала Эпохи 1970-01-01 00:00:00 +0000, UTC). Различие между функциями заключается в том, что timelocal() во время преобразования принимает во внимание локальный часовой пояс, когда как timegm() во входном параметре использует Всемирное координированное время (Coordinated Universal Time, UTC).

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

## ОШИБКИ
EOVERFLOW

Результат не может быть представлен.

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

Интерфейс

Атрибут

Значение

timelocal(), timegm()

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

MT-Safe env locale

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

## ЗАМЕЧАНИЯ
Функция timelocal() эквивалентна стандартной функции POSIX mktime(3). Нет ни одной причины когда-либо её использовать.

## СМОТРИТЕ ТАКЖЕ
gmtime(3), localtime(3), mktime(3), tzset(3)


timeradd

title: timeradd(3)

summary: операции со

text:
# timeradd(3)

## ИМЯ
timeradd, timersub, timercmp, timerclear, timerisset - операции со структурой timeval

## ОБЗОР

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

```
void timeradd(struct timeval *a, struct timeval *b,
              struct timeval *res);
```

```
void timersub(struct timeval *a, struct timeval *b,
              struct timeval *res);
```

```
void timerclear(struct timeval *tvp);
```

```
int timerisset(struct timeval *tvp);
```

```
int timercmp(struct timeval *a, struct timeval *b, CMP);
```

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

Все вышеперечисленные функции:

начиная с glibc 2.19:

_DEFAULT_SOURCE

glibc 2.19 и старее:

_BSD_SOURCE

## ОПИСАНИЕ
Макросы предназначены для работы со структурой timeval, которая определена в <sys/time.h> следующим образом:

```
struct timeval {

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

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

Макрос timeradd() складывает значения времени a и b, и помещает сумму в timeval, на которую указывает res. Результат нормализуется так, что значение res->tv_usec лежит в диапазоне от 0 до 999999.

Макрос timersub() вычитает значение времени b из a, и помещает результат в timeval, на которую указывает res. Результат нормализуется так, что значение res->tv_usec лежит в диапазоне от 0 до 999999.

Макрос timerclear() обнуляет структуру timeval, на которую указывает tvp; полученное значение соответствует представлению эпохи: 1970-01-01 00:00:00 +0000 (UTC).

Макрос timerisset() возвращает истину (не ноль), если любое из полей структуры timeval, на которую указывает tvp, содержит ненулевое значение.

Макрос timercmp() сравнивает значения таймера a и b с помощью оператора сравнения CMP, и возвращает истину (не ноль) или ложь (0), в зависимости от результата сравнения. Некоторые системы (но не Linux/glibc) содержат некорректную реализацию timercmp(), в которой CMP для >=, <= и == не работает; переносимые приложения могут использовать вместо неё

!timercmp(..., <)

!timercmp(..., >)

!timercmp(..., !=)

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Макросы timerisset() и timercmp() возвращают истину (не ноль) или ложь (0).

## ОШИБКИ
Ошибок не предполагается.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Не являются частью POSIX.1. Присутствует в вариациях BSD.

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


tmpfile

title: tmpfile(3)

summary: создаёт временный файл

text:
# tmpfile(3)

## ИМЯ
tmpfile - создаёт временный файл

## ОБЗОР

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

```
FILE *tmpfile(void);
```

## ОПИСАНИЕ
Функция tmpfile() открывает уникальный временный файл в режиме чтения/записи (w+b). Файл будет автоматически удален, когда будет закрыт либо когда завершится программа.

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

## ОШИБКИ
EACCES

Запрещен поиск для директории, содержащейся в пути файла.

EEXIST

Невозможно сгенерировать уникальное имя файла.

EINTR

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

EMFILE

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

ENFILE

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

ENOSPC

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

EROFS

Read-only filesystem.

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

Интерфейс

Атрибут

Значение

tmpfile()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
POSIX.1-2001 уточняет: сообщение с ошибкой может быть выведено в stdout, если поток не может быть открыт.

Стандартом не указывается, в какой директорию будет использовать tmpfile(). Glibc попытается использовать префикс пути P_tmpdir, указанный в <stdio.h>, если это закончится неудачей, то - /tmp.

## СМОТРИТЕ ТАКЖЕ
exit(3), mkstemp(3), mktemp(3), tempnam(3), tmpnam(3)


tmpnam

title: tmpnam(3)

summary: создаёт имя для временного файла

text:
# tmpnam(3)

## ИМЯ
tmpnam, tmpnam_r - создаёт имя для временного файла

## ОБЗОР

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

```
char *tmpnam(char *s);
char *tmpnam_r(char *s);
```

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

tmpnam_r()

Начиная с glibc 2.19:

_DEFAULT_SOURCE

Начиная с glibc 2.19:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Замечание: не используйте эти функции; вместо них используйте mkstemp(3) или tmpfile(3).

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

Созданное имя файла содержит префикс каталога P_tmpdir (L_tmpnam и P_tmpdir определены в <stdio.h> также, как TMP_MAX, описанная ниже).

Функция tmpnam_r() выполняет ту же задачу, что и tmpnam(), но возвращает NULL (возникла ошибка), если s равно NULL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Эти функции возвращают указатель на уникальное имя временного файла, либо NULL, если уникальное имя невозможно сгенерировать.

## ОШИБКИ
Ошибок не предполагается.

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

Интерфейс

Атрибут

Значение

tmpnam()

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

MT-Unsafe race:tmpnam/!s

tmpnam_r()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
tmpnam(): SVr4, 4.3BSD, C89, C99, POSIX.1-2001. В POSIX.1-2008 функция tmpnam() помечена как устаревшая.

Функция tmpnam_r() является нестандартным расширением, но доступна и в некоторых других системах.

## ЗАМЕЧАНИЯ
Функция tmpnam() генерирует уникальное имя каждый раз, до TMP_MAX вызовов. Если она будет вызвана более чем TMP_MAX раз, то дальнейшее поведение определяется конкретной реализацией.

Хотя эти функции генерируют имена, которые трудно подобрать, тем не менее, есть вероятность, что за промежуток времени, когда вернётся имя файла и программа откроет его, другая программа успеет создать с помощью open(2) файл с таким же именем или символическую ссылку, что может привести к проблемам с безопасностью. Чтобы исключить подобную вероятность, для открытия файла используйте open(2) с флагом O_EXCL. А ещё лучше — воспользуйтесь mkstemp(3) или tmpfile(3).

Если определён _POSIX_THREADS или _POSIX_THREAD_SAFE_FUNCTIONS, то в переносимых приложениях с нитями нельзя вызывать tmpnam() с аргументом NULL.

## ДЕФЕКТЫ
Никогда не используйте эти функции. Вместо них используйте mkstemp(3) или tmpfile(3).

## СМОТРИТЕ ТАКЖЕ
mkstemp(3), mktemp(3), tempnam(3), tmpfile(3)


toascii

title: toascii(3)

summary: преобразует символ в код ASCII

text:
# toascii(3)

## ИМЯ
toascii - преобразует символ в код ASCII

## ОБЗОР

```
#include <ctype.h>
```

```
int toascii(int c);
```

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

toascii(): _XOPEN_SOURCE

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

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

## ОПИСАНИЕ
toascii() преобразует c в 7-битное значение типа unsigned char, которое включено в набор символов ASCII, очищая при этом старшие биты.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращаемое значение — преобразованный символ.

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

Интерфейс

Атрибут

Значение

toascii()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, BSD, POSIX.1-2001. В POSIX.1-2008 toascii() отмечена устаревшей с примечанием, что её нельзя использовать в локализованных приложениях.

## ДЕФЕКТЫ
Многие люди станут несчастными, если вы воспользуетесь этой функцией. Данная функция преобразует все символы с диакритическими знаками в случайные символы.

## СМОТРИТЕ ТАКЖЕ
isascii(3), tolower(3), toupper(3)


toupper

title: toupper(3)

summary: преобразуют регистр символов

text:
# toupper(3)

## ИМЯ
toupper, tolower, toupper_l, tolower_l - преобразуют регистр символов

## ОБЗОР

```
#include <ctype.h>
```

```
int toupper(int c);
int tolower(int c);
```

```
int toupper_l(int c, locale_t locale);
int tolower_l(int c, locale_t locale);
```

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

toupper_l(), tolower_l():

Начиная с glibc 2.10:

_XOPEN_SOURCE >= 700

До glibc 2.10:

_GNU_SOURCE

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

Если c — строчная буква, то toupper() возвращает её заглавный эквивалент, если он есть в текущей локали. В противном случае возвращается c. Функция toupper_l() выполняет ту же задачу, но использует локаль, на которую ссылается описатель локали locale.

Если c — заглавная буква, то tolower() возвращает её строчный эквивалент, если он есть в текущей локали. В противном случае возвращается c. Функция tolower_l() выполняет ту же задачу, но использует локаль, на которую ссылается описатель локали locale.

Если c имеет значение не типа unsigned char или не равно EOF, то поведение этих функций не определено.

Поведение toupper_l() и tolower_l() не определено, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или некорректному описателю объекта локали.

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

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

Интерфейс

Атрибут

Значение

toupper(), tolower(), toupper_l(), tolower_l()

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

MT-Safe

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

toupper_l(), tolower_l(): POSIX.1-2008.

## ЗАМЕЧАНИЯ
Стандартами требуется, что аргумент c этих функций равнялся EOF или значению, которое представимо типом unsigned char. Если аргумент c имеет тип char, то он должен приводиться к unsigned char как в следующем примере:

```
char c;
...
res = toupper((unsigned char) c);
```

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

Особенности подстановки строчных и прописных букв зависят от локали. Например, в локали по умолчанию "C" ничего не сказано про умляуты, поэтому они не преобразовываются.

В некоторых не английских локалях существуют строчные буквы без заглавного аналога; например немецкая sharp.

## СМОТРИТЕ ТАКЖЕ
isalpha(3), newlocale(3), setlocale(3), towlower(3), towupper(3), uselocale(3), locale(7)


towctrans

title: towctrans(3)

summary: транслитерация широкого символа

text:
# towctrans(3)

## ИМЯ
towctrans - транслитерация широкого символа

## ОБЗОР

```
#include <wctype.h>
```

```
wint_t towctrans(wint_t wc, wctrans_t desc);
```

## ОПИСАНИЕ
Если аргумент wc — это широкий символ, то функция towctrans транслирует его в соответствии с описателем desc. Если wc равно WEOF, то возвращается WEOF.

Значение desc должно быть описателем транслитерации, возвращаемым функцией wctrans(3).

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

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

Интерфейс

Атрибут

Значение

towctrans()

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

MT-Safe

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

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

## СМОТРИТЕ ТАКЖЕ
towlower(3), towupper(3), wctrans(3)


towlower

title: towlower(3)

text:
# towlower(3)

## ИМЯ
towlower, towlower_l - преобразует широкий символ к нижнему регистру

## ОБЗОР

```
#include <wctype.h>
```

```
wint_t towlower(wint_t wc);
```

```
wint_t towlower_l(wint_t wc, locale_t locale);
```

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

towlower_l():

Начиная с glibc 2.10:

_XOPEN_SOURCE >= 700

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция towlower() является широкосимвольным аналогом функции tolower(3). Если wc является широким символом в верхнем регистре и в текущей локали существует эквивалент в нижнем регистре, то возвращается эквивалент wc в нижнем регистре. Во всех остальных случаях wc возвращается неизменным.

Функция towupper_l() производит то же действие, но выполняет преобразование на основе информации о типе символа в локали, указанной в locale. Поведение towupper_l() не определёно, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или некорректному описателю объекта локали.

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если wc был преобразован к нижнему регистру, то towlower() возвращает его эквивалент в нижнем регистре; в противном случае возвращается wc.

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

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

Интерфейс

Атрибут

Значение

towlower()

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

MT-Safe locale

towlower_l()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
towlower(): C99, POSIX.1-2001 (XSI); расширение XSI в POSIX.1-2008, но помечена как устаревшая.

towlower_l(): POSIX.1-2008.

## ЗАМЕЧАНИЯ
Поведение этих функций зависит от категории LC_CTYPE локали.

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

## СМОТРИТЕ ТАКЖЕ
iswlower(3), towctrans(3), towupper(3), locale(7)


towupper

title: towupper(3)

text:
# towupper(3)

## ИМЯ
towupper, towupper_l - преобразует широкий символ к верхнему регистру

## ОБЗОР

```
#include <wctype.h>
```

```
wint_t towupper(wint_t wc);
```

```
wint_t towupper_l(wint_t wc, locale_t locale);
```

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

towupper_l():

Начиная с glibc 2.10:

_XOPEN_SOURCE >= 700

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция towupper() является широкосимвольным аналогом функции toupper(3). Если wc является широким символом в нижнем регистре и в текущей локали существует эквивалент в верхнем регистре, то возвращается эквивалент wc в верхнем регистре. Во всех остальных случаях wc возвращается неизменным.

Функция towupper_l() производит то же действие, но выполняет преобразование на основе информации о типе символа в локали, указанной в locale. Поведение towupper_l() не определёно, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или некорректному описателю объекта локали.

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

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если wc был преобразован к верхнему регистру, то towupper() возвращает его эквивалент в верхнем регистре; в противном случае возвращается wc.

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

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

Интерфейс

Атрибут

Значение

towupper()

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

MT-Safe locale

towupper_l()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
towupper(): C99, POSIX.1-2001 (XSI); расширение XSI в POSIX.1-2008, но помечена как устаревшая.

towupper_l(): POSIX.1-2008.

## ЗАМЕЧАНИЯ
Поведение этих функций зависит от категории LC_CTYPE локали.

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

## СМОТРИТЕ ТАКЖЕ
iswupper(3), towctrans(3), towlower(3), locale(7)


trunc

title: trunc(3)

text:
# trunc(3)

## ИМЯ
trunc, truncf, truncl - округление числа до целого в меньшую сторону

## ОБЗОР

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

```
double trunc(double x);
float truncf(float x);
long double truncl(long double x);
```

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

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

trunc(), truncf(), truncl():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

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

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

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

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

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

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

Интерфейс

Атрибут

Значение

trunc(), truncf(), truncl()

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

MT-Safe

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

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

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


tsearch

title: tsearch(3)

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

text:
# tsearch(3)

## ИМЯ
tsearch, tfind, tdelete, twalk, tdestroy - работа с двоичным деревом поиска

## ОБЗОР

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

```
typedef enum { preorder, postorder, endorder, leaf } VISIT;
```

```
void *tsearch(const void *key, void **rootp,
                int (*compar)(const void *, const void *));
```

```
void *tfind(const void *key, void *const *rootp,
                int (*compar)(const void *, const void *));
```

```
void *tdelete(const void *key, void **rootp,
                int (*compar)(const void *, const void *));
```

```
void twalk(const void *root,
                void (*action)(const void *nodep, VISIT which,
                               int depth));
```

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

```
void twalk_r(const void *root,
                void (*action)(const void *nodep, VISIT which,
                               void *closure),
                void *closure);
```

```
void tdestroy(void *root, void (*free_node)(void *nodep));
```

## ОПИСАНИЕ
Функции tsearch(), tfind(), twalk() и tdelete() позволяют работать с двоичным деревом поиска. Они реализуют «Algorithm T» Д. Кнута (6.2.2). Первое поле в каждом узле дерева является указателем на соответствующий элемент данных (вызывающая программа должна хранить реальные данные). Аргумент compar указывает на процедуру сравнения, которой передаются указатели на два элемента данных. Эта процедура должна возвращать отрицательное, нулевое или положительное значение, если первый элемент меньше, равен или больше чем второй.

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

Функция tfind() похожа на tsearch(), за исключением того, что tfind() в случае нулевого результата поиска возвращает NULL.

Функция tdelete() удаляет элемент из дерева. Аргументы те же, что и для tsearch().

Функция twalk() выполняет обход дерева, сначала в глубину, затем слева направо. Аргумент root указывает на начальный элемент обхода. Если этот узел не является корневым, то будет пройдена только часть дерева. Функция twalk вызывает пользовательскую функцию action для каждого посещаемого узла (то есть три раза для внутреннего узла и один раз для конечного узла-листа). Функция action получает три аргумента. Первый — указатель на посещаемый узел. Структура узла не определена, но возможно привести указатель к указателю на указатель на элемент, чтобы получить доступ к элементу, хранящемуся внутри узла. Приложение не должно изменять структуру, на которую указывает этот аргумент. Второй — целое число, принимающее значение preorder, postorder или endorder в зависимости от того, в первый, второй или третий раз посещается внутренний узел, или значение leaf, если это единственный просмотр узла-листа. Эти символы определены в <search.h>. Третий аргумент — это глубина текущего погружения в дерево; для корня она равна нулю.

(В общем случае, функции preorder, postorder и endorder известны как preorder, inorder и postorder: перед посещением потомков, после первого посещения и перед вторым и после посещения. Таким образом, выбор имени postorder приводит к путанице.)

Функция twalk_r() подобна twalk(), но вместо аргумента depth передаётся неизменяемый аргумент-указатель closure в каждый вызов функции обратного вызова. Этот указатель можно использовать для передачи информации в и из функции обратного вызова безопасным для нитей образом, не задействуя глобальные переменные.

Функция tdestroy() удаляет всё дерево, на которое указывает rootp, высвобождая все ресурсы, выделенные функцией tsearch(). Для данных каждого узла дерева вызывается функция free_node. Указатель на данные передаётся в аргумент функции. Если делать ничего не нужно, то в free_node нужно указать функцию, которая ничего не делает.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция tsearch() возвращает указатель на найденный узел дерева или добавляет новый узел, а также возвращает NULL, если для добавления недостаточно памяти. Функция tfind() возвращает указатель на узел или NULL, если совпадений не найдено. Если есть несколько элементов с одинаковым ключом, то какой из них будет возвращён — не определено.

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

Функции tsearch(), tfind() и tdelete() также возвращают NULL, если rootp для записи был равен NULL.

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

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

Интерфейс

Атрибут

Значение

tsearch(), tfind(), tdelete()

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

MT-Safe race:rootp

twalk()

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

MT-Safe race:root

twalk_r()

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

MT-Safe race:root

tdestroy()

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

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4. Функции tdestroy() и twalk_r() являются расширениями GNU.

## ЗАМЕЧАНИЯ
Функции twalk() передаётся указатель на корень, а остальные функции ожидают указатель на переменную, которая указывает на корень.

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

Программа в примере зависит от того, что twalk() больше не ссылается на узел после вызова пользовательской функции с аргументом «endorder» или «leaf». Это работает с реализацией библиотеки GNU, но этого нет в документации System V.

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

```
#define _GNU_SOURCE     /* для объявления tdestroy() */
#include <search.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
static void *root = NULL;
static void *
xmalloc(unsigned n)
{

    void *p;

    p = malloc(n);

    if (p)

        return p;

    fprintf(stderr, "недостаточно памяти\n");

    exit(EXIT_FAILURE);
}
static int
compare(const void *pa, const void *pb)
{

    if (*(int *) pa < *(int *) pb)

        return -1;

    if (*(int *) pa > *(int *) pb)

        return 1;

    return 0;
}
static void
action(const void *nodep, VISIT which, int depth)
{

    int *datap;

    switch (which) {

    case preorder:

        break;

    case postorder:

        datap = *(int **) nodep;

        printf("%6d\n", *datap);

        break;

    case endorder:

        break;

    case leaf:

        datap = *(int **) nodep;

        printf("%6d\n", *datap);

        break;

    }
}
int
main(void)
{

    int i, *ptr;

    void *val;

    srand(time(NULL));

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

        ptr = xmalloc(sizeof(int));

        *ptr = rand() & 0xff;

        val = tsearch((void *) ptr, &root, compare);

        if (val == NULL)

            exit(EXIT_FAILURE);

        else if ((*(int **) val) != ptr)

            free(ptr);

    }

    twalk(root, action);

    tdestroy(root, free);

    exit(EXIT_SUCCESS);
}
```

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


ttyname

title: ttyname(3)

summary: возвращает имя терминала

text:
# ttyname(3)

## ИМЯ
ttyname, ttyname_r - возвращает имя терминала

## ОБЗОР

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

```
char *ttyname(int fd);
```

```
int ttyname_r(int fd, char *buf, size_t buflen);
```

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

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

## ОШИБКИ
EBADF

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

ENODEV

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

ENOTTY

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

ERANGE

(ttyname_r()) Значение buflen мало для хранения имени пути.

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

Интерфейс

Атрибут

Значение

ttyname()

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

MT-Unsafe race:ttyname

ttyname_r()

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

MT-Safe

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

## ЗАМЕЧАНИЯ
Процесс, сохранивший файловый дескриптор, указывающий на устройство pts(4), открытым при переключении в другое пространство имён монтирования, в котором используется другой экземпляр /dev/ptmx, может неожиданно обнаружить, что существует путь устройства с тем же именем как у этого файлового дескриптора. Однако данный путь указывает на другое устройство и поэтому не может использоваться для доступа к устройству, на который указывает файловый дескриптор. Вызов ttyname() или ttyname_r() с файловым дескриптором в новом пространстве имён монтирования приведёт к тому, что эти функции вернут NULL и присвоят errno значение ENODEV.

## СМОТРИТЕ ТАКЖЕ
tty(1), fstat(2), ctermid(3), isatty(3), pts(4)


ttyslot

title: ttyslot(3)

text:
# ttyslot(3)

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

## ОБЗОР
\#include <unistd.h> /* смотрите ЗАМЕЧАНИЯ */

int ttyslot(void);

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

ttyslot():

Начиная с glibc 2.24:

_DEFAULT_SOURCE

Начиная с glibc 2.20 по 2.23:

_DEFAULT_SOURCE ||

_XOPEN_SOURCE && _XOPEN_SOURCE < 500

В Glibc 2.19 и старее:

_BSD_SOURCE ||

_XOPEN_SOURCE && _XOPEN_SOURCE < 500

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

«В каком файле?» — спросите вы. Что же, для начала обратимся к истории.

### Доисторические времена
В UNIX V6 использовался файл /etc/ttys, который читался программой init(1) для определения того, что делать с каждым терминалом. Каждая строка содержала три символа. Первый символ мог быть '0' или '1' (где '0' означало «ignore»). Второй символ обозначал терминал: '8' означал «/dev/tty8». Третий символ был аргументом для getty(8), обозначающим начальную скорость передачи символов (например, '-' означал начинать с 110 бод). Обычная строка в файле, таким образом, имела вид «18-». Зависание какого-либо терминала обычно решалось изменением '1' на '0', подачей сигнала в init, возвращением исходного значения и ещё одной подачей сигнала в init.

В UNIX V7 формат изменился. Второй символ стал аргументом getty(8) для определения последовательного перебора скоростей ('0' означал цикл 300-1200-150-110 бод; '4' предназначался для онлайн-консоли DECwriter), а оставшиеся символы содержали имя tty. Таким образом, обычная строка была «14console».

В последующих системах синтаксис был ещё разнообразней. В системах, основанных на System V, использовался /etc/inittab.

### Доисторические времена (2)
С другой стороны, существовал файл /etc/utmp, в котором перечислены люди, вошедшие в систему. Этот файл управлялся с помощью login(1). Он имел фиксированную длину, а соответствующий индекс в файле определялся login(1) с помощью вызова ttyslot() и нахождения номера строки в /etc/ttys (начиная с 1).

### Семантика ttyslot
Таким образом, функция ttyslot() возвращает из файла /etc/ttys индекс управляющего терминала вызывающего процесса, который является таким же (обычно), что и индекс записи текущего пользователя в файле /etc/utmp. В BSD файл /etc/ttys все ещё был, однако в System V его уже не было, и из-за этого на него невозможно было ссылаться. Поэтому в подобных системах в документации указано, что ttyslot() возвращает индекс текущего пользователя на основании базы данных пользователей.

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

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

Интерфейс

Атрибут

Значение

ttyslot()

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

MT-Unsafe

## СООТВЕТСТВИЕ СТАНДАРТАМ
SUSv1; в SUSv2 отмечена как УСТАРЕВШАЯ; удалена в POSIX.1-2001. SUSv2 требует возврата -1 в случае ошибки.

## ЗАМЕЧАНИЯ
Файл utmp в различных системах может находиться в различных местах: /etc/utmp, /var/adm/utmp, /var/run/utmp.

Реализация этой функции в glibc2 читает файл _PATH_TTYS, определённый в <ttyent.h> как «/etc/ttys». В случае ошибки она возвращает 0. Так как в системах Linux файла «/etc/ttys» обычно нет, то она всегда возвращает 0.

В BSD-подобных системах и Linux объявление ttyslot() находится в файле <unistd.h>. В System V-подобных системах объявление находится в файле <stdlib.h>. Начиная с glibc 2.24 в <stdlib.h> также поместили это объявление под следующий макрос тестирования свойств:

```
(_XOPEN_SOURCE >= 500 ||

        (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED))

    && ! (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)
```

В Minix также есть fttyslot(fd).

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