Сервер содержит море(!) аналитической информации
|
CIT Forum CD-ROM
|
|
INTRO(2)
НАЗВАНИЕ
intro - введение в описание системных вызовов и номеров ошибок
СИНТАКСИС
#include <errno.h>
ОПИСАНИЕ
В этом разделе описываются все системные вызовы. Большинство из них имеют одно или несколько значений кода
завершения при ошибке. Состояние ошибки определяется
возвращением значения, невозможного в другом случае.
Почти всегда это -1 или указатель NULL; детали оговариваются при описании каждого вызова. Номер ошибки доступен также через внешнюю переменную errno. Эта переменная не обнуляется при успешных вызовах, поэтому имеет
смысл использовать ее значение только в случае обнаружения ошибки.
В описании каждого системного вызова приводится список
возможных номеров ошибок. Ниже приводится полный список
номеров ошибок и их мнемонических имен, как они определены во включаемом файле <errno.h>.
- 1 EPERM Не владелец
- Обычно эта ошибка указывает на попытку модифицировать файл, доступ к которому разрешен только его
владельцу и суперпользователю.
- 2 ENOENT Не найден файл или каталог
- Эта ошибка имеет место, если имя файла указано и
файл должен был бы существовать, однако его нет;
или если один из каталогов, указанных в маршрутном
имени, не существует.
- 3 ESRCH Нет такого процесса
- Процесс, соответствующий заданному идентификатору
процесса (pid) в системном вызове kill(2) или
ptrace(2), не может быть найден.
- 4 EINTR Прерывание системного вызова
- Асинхронный сигнал (такой как сигнал прерывания
или выхода), перехватываемый пользователем, пришел
во время выполнения системного вызова. Если после
обработки сигнала будет продолжено выполнение
программы, то системный вызов завершится с ошибкой.
- 5 EIO Ошибка ввода/вывода
- Обнаружена ошибка ввода/вывода. Эта ошибка может
иногда иметь место во время вызова, который следует за вызовом, к которому на самом деле относится
эта ошибка.
- 6 ENXIO Неверное устройство или адрес
- Ввод/вывод в специальный файл ссылается на устройство, которое не существует; или исчерпаны лимиты
устройства для ввода/вывода. Эта ошибка может также иметь место, если магнитофон находится в пассивном состоянии или не установлен пакет дисков.
- 7 E2BIG Длинный список аргументов
- При обращении к системному вызову из семейства
exec(2) задан список аргументов, содержащий более
5120 байт.
- 8 ENOEXEC Неверный формат выполняемого файла
- Сделан запрос на выполнение файла, который, хотя и
имеет соответствуюшие права, не начинается с допустимого магического числа [см. a.out(4)].
- 9 EBADF Неверный номер файла
- Или дескриптор файла указывает на неоткрытый файл,
или запрос на чтение (соответственно запись) сделан для файла, открытого только для записи (соответственно чтения).
- 10 ECHILD Нет порожденных процессов
- Системный вызов wait(2) был выполнен процессом, не
имеющим существующих порожденных процессов или
процессов, которых он не дождался.
- 11 EAGAIN Слишком много процессов
- Системный вызов fork(2) завершился аварийно, так
как системная таблица процессов полна или пользователю не разрешено более создавать новые процессы.
- 12 ENOMEM Исчерпано пространство
- Во время выполнения системных вызовов exec(2),
brk(2), или sbrk(2) программе потребовалось места
в памяти больше, чем система может выделить. Это
не временное условие; максимальный размер пространства является системным параметром. Ошибка может также иметь место, если набор секций команд
данных и стека требует слишком много сегментных
регистров или, если при вызове fork(2) недостаточно места в области подкачки.
- 13 EACCES Нарушение прав доступа
- Была предпринята попытка получить доступ к файлу,
а прав для этого нет.
- 14 EFAULT Недопустимый адрес
- Произошло прерывание при попытке использования аргументов системного вызова.
- 15 ENOTBLK Требуется блочное устройство
- Не блочный файл указан там, где ожидался блочный,
например, в вызове mount(2).
- 16 EBUSY Устройство или ресурс заняты
- Была сделана попытка смонтировать устройство, которое уже смонтировано, или была предпринята попытка размонтировать устройство, на котором находится активный файл (открытый файл, текущий каталог, смонтированный файл или активная секция команд). Эта ошибка также имеет место при попытке
разрешить сбор статистики, если он уже разрешен.
- 17 EEXIST Файл уже существует
- Существующий файл указан в неподходящем контексте,
например в качестве аргумента системного вызова
link(2).
- 18 EXDEV Ссылка на другое устройство
- Была предпринята попытка создать ссылку на файл,
расположенный на другом устройстве.
- 19 ENODEV Неподходящее устройство
- Была предпринята попытка выполнить системный вызов, неподходящий в данном контексте, например попытка чтения с устройства, открытого только для
записи.
- 20 ENOTDIR Требуется каталог
- Там где ожидалось имя каталога, указано нечто другое; например, в маршрутном имени или в качестве
аргумента системного вызова chdir(2).
- 21 EISDIR Попытка записи в каталог
- 22 EINVAL Недопустимый аргумент
- Недопустимое значение аргумента (например, размонтирование несмонтированного устройства; указание
неопределенного сигнала при вызове signal(2) или
kill(2); чтение или запись в файл, для которого
вызов lseek(2) вернул отрицательный указатель).
Также устанавливается математическими функциями,
описанными в разделе 3M настоящего Справочника.
- 23 ENFILE Переполнена таблица файлов
- Системная таблица открытых файлов переполнена и
временно не может быть выполнен системный вызов
open(2).
- 24 EMFILE Слишком много открытых файлов
- Никакой процесс не может иметь больше, чем NOFILES
(по умолчанию 20) одновременно открытых дескрипторов файлов.
- 25 ENOTTY Не символьное устройство
- Была предпринята попытка выполнить системный вызов
ioctl(2) к файлу, который не является специальным
символьным.
- 26 ETXTBSY Перегружена секция команд
- Была предпринята попытка выполнить файл, который в
данный момент открыт для записи. Эта ошибка может
также означать попытку записи в файл, содержащий
выполняющуюся в данный момент программу.
- 27 EFBIG Слишком большой файл
- Размер файла превысил максимально допустимое значение ULIMIT [см. ulimit(2)].
- 28 ENOSPC Исчерпано пространство на устройстве
- При записи [посредством write(2)] в обычный файл
на устройстве не осталось свободного места. При
выполнении fcntl(2) установка или снятие блокировки с записей файла не может быть произведено, так
как в системе не осталось больше места.
- 29 ESPIPE Ошибка позиционирования
- Аргументом системного вызова lseek(2) является канал.
- 30 EROFS Смонтировано только для чтения
- Попытка модифицировать файл или каталог на устройстве, смонтированном только для чтения.
- 31 EMLINK Слишком много ссылок
- Была предпринята попытка создать более чем 100
ссылок на файл.
- 32 EPIPE Канал разрушен
- Была предпринята попытка записать в канал, из которого ни один процесс не читает данных. При этом
обычно генерируется сигнал; если сигнал игнорируется, то возвращается ошибка.
- 33 EDOMВыход за границы области определения
- Аргумент функции, описанной в разделе 3M, лежит
вне ее области определения.
- 34 ERANGE Переполнение
- Результат функции, описанной в разделе 3M, непредставим с допустимой в машине точностью.
- 35 ENOMSG Нет сообщений такого типа
- Была предпринята попытка получить сообщение типа,
который не существует в указанной очереди сообщений [см. msgop(2)].
- 36 EIDRM Идентификатор удален
- Эта ошибка возвращается процессам, которые возобновляют выполнение из-за удаления идентификатора
очереди сообщений, семафора или разделяемого сегмента из системной таблицы имен [см. msgctl(2),
semctl(2), shmctl(2)].
- 37-44 Зарезервированные номера
- 45 EDEADLK Тупик обнаружен и обойден
- Была обнаружена и исправлена тупиковая ситуация.
Эта ошибка свойственна операциям блокировки файлов
и их частей.
- 46 ENOLCK Ошибка блокировки
- При выполнении fcntl(2) установка или снятие блокировки файла не может быть произведено, так как в
системе не осталось больше места.
- 60 ENOSTR Не псевдоустройство
- Попытка выполнить системные вызовы putmsg(2) и
getmsg(2) для дескриптора файла, а файл не является псевдоустройством.
- 62 ETIME Истекло время для операции с псевдоустройством
- Время, отведенное на вызов ioctl(2) для псевдоустройства, истекло. Причина этой ошибки для разных
устройств разная - возможно, проявился дефект аппаратуры, или, быть может, виновата программа. Может быть, для операции просто отведено недостаточное время. Результат операции ioctl(2) неопределен.
- 63 ENOSR Исчерпаны ресурсы псевдоустройств
- При попытке выполнить системный вызов open(2) для
псевдоустройства не было доступных очередей или
структур данных.
- 64 ENONET Машина не в сети
- Эта ошибка возможна только при работе с системой
разделения удаленных файлов (РУФ). Она имеет место, когда пользователь пытается афишировать, скрывать, монтировать, размонтировать удаленные ресурсы в то время, когда компьютер еще не проделал все
положенные процедуры для подключения к сети.
- 65 ENOPKG Не та конфигурация
- Эта ошибка имеет место, когда пользователь пытается использовать системный вызов, не входящий в текущую конфигурацию системы.
- 66 EREMOTE Удаленный ресурс
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда пользователь пытается афишировать ресурс, который не находится на локальной машине, или пытается монтировать/размонтировать устройство, которое находится на удаленной системе.
- 67 ENOLINK Разорвана связь
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда происходит обращение к удаленной системе, связи с которой в данный момент нет.
- 68 EADV Ошибка афиширования
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда пользователь пытается афишировать ресурс, который уже афиширован, или пытается
прекратить работу РУФ или начать размонтирование,
когда есть еще афишированные ресурсы.
- 69 ESRMNT Есть смонтированные
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда пользователь пытается прекратить работу РУФ в то время, когда есть еще ресурсы, смонтированные с удаленной системы.
- 70 ECOMM Ошибка связи
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда пользователь пытается послать
сообщение на удаленную машину, связи с которой в
данный момент нет.
- 71 EPROTO Ошибка протокола
- Обнаружена какая-либо ошибка протокола. Эта ошибка
специфична для различных устройств, но не означает
сбоя оборудования.
- 74 EMULTIHOP Нет прямой связи
- Эта ошибка возможна только при работе с РУФ. Она
имеет место, когда пользователь пытается получить
доступ к удаленным ресурсам, которые напрямую недоступны.
- 77 EBADMSG Недопустимое сообщение
- При выполнении системных вызовов read(2),
getmsg(2) или вызова ioctl(2) для псевустройства,
с аргументом I_RECVFD, в начале очереди оказалось
нечто, что не может быть обработано. Что именно
- зависит от системного вызова:
read(2) Управляющая информация или переданный дескриптор файла.
getmsg(2) Переданный дескриптор файла.
ioctl(2) Управляющая информация или данные.
- 83 ELIBACC Нет доступа к разделяемой библиотеке
- Попытка выполнить вызов exec(2) для файла a.out,
который ссылается на разделяемую библиотеку, а
библиотека не существует или у пользователя не
хватает прав для ее использования.
- 84 ELIBBAD Повреждение разделяемой библиотеки
- Попытка выполнить вызов exec(2) для файла a.out,
который ссылается на разделяемую библиотеку, а
exec(2) не может загрузить эту библиотеку. Возможно, структура разделяемой библиотеки нарушена.
- 85 ELIBSCN Повреждение секции библиотек
- Попытка выполнить вызов exec(2) для файла a.out,
который ссылается на разделяемую библиотеку, а в
секции библиотек (.lib) файла a.out находятся неверные данные. В секции библиотек хранятся сведения для exec(2) о том, какие разделяемые библиотеки требуются. Возможно, структура файла a.out нарушена.
- 86 ELIBMAX Много ссылок на разделяемые библиотеки
- Попытка выполнить вызов exec(2) для файла a.out,
который использует больше разделяемых библиотек,
чем разрешено в данной конфигурации системы.
- 87 ELIBEXEC Выполняется разделяемая библиотека
- Попытка выполнить вызов exec(2) непосредственно
для разделяемой библиотеки, что запрещено.
ОПРЕДЕЛЕНИЯ
Идентификатор процесса (pid). Каждый активный процесс в
системе имеет уникальный номер (положительное целое
число) называемый идентификатором процесса. Значение
этого идентификатора лежит в пределах от 0 до 30000.
Идентификатор родительского процесса (ppid). Новый процесс создан активным в данный момент процессом [см.
fork(2)], который называется родительским.
Идентификатор группы процессов. Каждый активный процесс
является членом группы процессов, которая идентифицируется положительным целым числом, называемым идентификатором группы процессов. Этим идентификатором является
идентификатор лидера группы. Группировка процессов позволяет посылать сигналы между взаимосвязанными процессами [см. kill(2)].
Идентификатор группы терминала. Каждый активный процесс
может быть членом группы терминала, которая идентифицируется положительным целым числом, называемым идентификатором группы терминала. Этот способ группирования используется для терминирования группы взаимосвязанных
процессов при терминировании одного из процессов группы
[см. exit(2) и signal(2)].
Реальный идентификатор пользователя и реальный идентификатор группы. Каждый пользователь, известный системе,
идентифицируется положительным целым числом (от 0 до
65535), называемым реальным идентификатором пользователя.
Каждый пользователь является также членом какой-либо
группы. Группа также идентифицируется положительным целым числом, называемым реальным идентификатором группы.
Активный процесс имеет реальный идентификатор пользователя и реальный идентификатор группы, которые устанавливаются равными реальному идентификатору пользователя
и реальному идентификатору группы того пользователя,
кто запустил данный процесс.
Действующий идентификатор пользователя процесса и действующий идентификатор группы процесса. Активный процесс имеет действующий идентификатор пользователя и
действующий идентификатор группы, которые используются
для определения прав доступа к файлам (см. ниже). Действующий идентификатор пользователя и действующий идентификатор группы обычно равны реальному идентификатору
пользователя и реальному идентификатору группы, если
только сам процесс или один из его предков не был запущен из файла, имеющего установленный бит разрешения переустановки идентификатора пользователя или группы [см.
exec(2)].
Суперпользователь. Процесс рассматривается как суперпользовательский и имеет специальные привилегии, например, все права доступа к любому файлу, если его действующий идентификатор пользователя есть 0.
Специальные процессы. Процессы, имеющие идентификаторы
процесса 0 и 1, являются специальными; в дальнейшем они
называются proc0 и proc1.
Proc0 - это планировщик. Proc1 - процесс инициализации
работы (init). Proc1 является предком любого другого
процесса в системе и используется для контроля за
структурой процессов.
Дескриптор файла. Дескриптор файла есть небольшое целое
число, используемое для операций ввода/вывода в файл;
он может принимать значения от 0 до (NOFILES - 1), поэтому процесс не может иметь одновременно открытыми более чем NOFILES дескрипторов файлов. Дескриптор файла
возвращается такими системными вызовами, как open(2)
или pipe(2) и используется как аргумент в системных вызовах, подобных read(2), write(2), ioctl(2) и close(2).
Имя файла. Имя, содержащее от 1 до 14 символов, может
использоваться в качестве имени обычного файла, специального файла или каталога.
Эти символы могут быть любыми доступными символами из
набора символов ASCII, кроме символов \0 (null) и /.
Не рекомендуется использовать в именах файлов символы
*, ?, [ или ], так как shell трактует их особым образом
[см. sh(1)]. Хотя это и разрешено, но не рекомендуется
использовать в именах файлов управляющие символы.
Маршрутное имя и маршрут. Маршрутное имя есть цепочка
символов, заканчивающаяся нулевым байтом, и, возможно,
начинающаяся с символа /, за которым указаны ноль или
более имен каталогов, разделенных символами /, а затем
(необязательное) имя файла.
Если маршрутное имя начинается с символа /, то маршрут
начинается с корневого каталога. Иначе, маршрут начинается с текущего рабочего каталога.
Одиночный символ / обозначает корневой каталог.
Если не оговорено противное, пустое маршрутное имя
рассматривается как имя несуществующего файла.
Каталог. Элементы каталога называются ссылками на
файл. Любой каталог содержит по крайней мере две ссылки: . и .., указывающие, соответственно, на сам каталог
и на вышележащий каталог (надкаталог).
Корневой каталог и текущий рабочий каталог. Каждый процесс имеет ассоциированный с ним корневой каталог и текущий рабочий каталог, для того, чтобы определить, как
осуществлять поиск по маршруту. Корневой каталог процесса не обязан совпадать с корневым каталогом корневой
файловой системы.
Права доступа к файлу. Процессу предоставляются права
на чтение, запись и выполнение/просмотр файла, если истинно хотя бы одно из следующих условий:
- Действующий идентификатор пользователя процесса
есть идентификатор суперпользователя.
- Действующий идентификатор пользователя процесса
совпадает с идентификатором владельца файла и соответствующие биты для владельца в режиме доступа
к файлу (0700) равны 1.
- Действующий идентификатор пользователя процесса не
совпадает с идентификатором владельца файла, но
действующий идентификатор группы процесса совпадает с идентификатором группы файла, и соответствующие биты для группы в режиме доступа к файлу
(0070) равны 1.
- Действующий идентификатор пользователя процесса не
совпадает с идентификатором владельца файла и действующий идентификатор группы процесса не совпадает с идентификатором группы файла, но соответствующие биты для прочих пользователей в режиме доступа к файлу (0007) равны 1.
Если все перечисленные условия ложны, прав на соответствующую операцию с файлом у процесса нет.
Идентификатор очереди сообщений. Идентификатор очереди
сообщений (msqid) есть уникальное положительное целое
число, возвращаемое системным вызовом msgget(2). С каждым таким идентификатором ассоциирована очередь сообщений и структура данных. Структура данных, обозначаемая
msqid_ds, содержит следующие компоненты:
struct ipc_perm msg_perm; /* Структура прав на выполнение операций */
struct msg *msg_first; /* Указатель на первое сообщение в очереди */
struct msg *msg_last; /* Указатель на последнее сообщение */
ushort msg_cbytes;/* Текущее число байт в очереди */
ushort msg_qnum; /* Число сообщений в очереди */
ushort msg_qbytes;/* Макс. допустимое число байт в очереди */
ushort msg_lspid; /* Идентификатор последнего отправителя */
ushort msg_lrpid; /* Идентификатор последнего получателя */
time_t msg_stime; /* Время последн. отправления */
time_t msg_rtime; /* Время последнего получения */
time_t msg_ctime; /* Время последнего изменения */
- msg_perm
- Структура типа ipc_perm, которая определяет права
на операции с сообщениями (см. ниже). Эта структура содержит следующие элементы:
ushort cuid; /* Идентификатор пользователя, создавшего очередь */
ushort cgid; /* Идентификатор группы создателя очереди */
ushort uid; /* Идентификатор пользователя */
ushort gid; /* Идентификатор группы */
ushort mode; /* Права на чтение/запись */
ushort seq; /* Последовательность номеров используемых слотов */
key_t key; /* Ключ */
- msg_first
- Указатель на первое сообщение в очереди.
- msg_last
- Указатель на последнее сообщение в очереди.
- msg_cbytes
- Текущее количество байт в очереди.
- msg_qnum
- Текущее количество сообщений в очереди.
- msg_qbytes
- Максимально допустимое количество байт в очереди.
- msg_lspid
- Идентификатор процесса, который последним выполнял
операцию msgsnd [см. msgop(2)].
- msg_lrpid
- Идентификатор процесса, который последним выполнял
операцию msgrcv [см. msgop(2)].
- msg_stime
- Время выполнения последней операции msgsnd.
- msg_rtime
- Время выполнения последней операции msgrcv.
- msg_ctime
- Время выполнения последней операции msgctl(2), которая изменила какой-либо элемент вышеописанной
структуры.
Время измеряется в секундах, начиная с 00:00:00 1 января 1970 года (по Гринвичу).
Права на операции с сообщениями. В описании системных
вызовов msgop(2) и msgctl(2) права, требуемые для операций, записаны в фигурных скобках { и }. Права состоят
в следующем:
00400 | Чтение для владельца. |
00200 | Запись для владельца. |
00040 | Чтение для группы. |
00020 | Запись для группы. |
00004 | Чтение для остальных. |
00002 | Запись для остальных. |
Процессу предоставляются права на чтение и запись по
идентификатору очереди, если истинно хотя бы одно из
следующих условий:
- Действующий идентификатор пользователя процесса
есть идентификатор суперпользователя.
- Действующий идентификатор пользователя процесса
совпадает со значением компонента msg_perm.cuid
или msg_perm.uid структуры данных, ассоциированной
с идентификатором очереди, и соответствующие биты
для владельца в msg_perm.mode (0600) равны 1.
- Действующий идентификатор группы процесса совпадает со значением компонента msg_perm.cgid или
msg_perm.gid структуры данных, ассоциированной с
идентификатором очереди, и соответствующие биты
для группы в msg_perm.mode (0060) равны 1.
- Соответствующие биты для прочих пользователей в
msg_perm.mode (0006) равны 1.
Если все перечисленные условия ложны, прав на соответствующую операцию с сообщениями у процесса нет.
Идентификатор множества семафоров. Идентификатор множества семафоров (semid) есть уникальное положительное
целое число, возвращаемое системным вызовом semget(2).
С каждым таким идентификатором ассоциировано множество
семафоров и структура данных. Структура данных, обозначаемая semid_ds, содержит следующие компоненты:
struct ipc_perm sem_perm; /* Структура прав на выполнение операций */
struct sem *sem_base; /* Указатель на первый семафор в множестве */
ushort sem_nsems; /* Количество семафоров в множестве */
time_t sem_otime; /* Время последней операции */
time_t sem_ctime; /* Время последнего изменения */
- sem_perm
- Структура типа ipc_perm, которая определяет права
на операции с семафорами (см. ниже). Эта структура
содержит следующие элементы:
ushort cuid; /* Идентификатор пользователя, создавшего множество семафоров */
ushort cgid; /* Идентификатор группы создателя множества семафоров */
ushort uid; /* Идентификатор пользователя */
ushort gid; /* Идентификатор группы */
ushort mode; /* Права на чтение/изменение */
ushort seq; /* Последовательность номеров используемых слотов */
key_t key; /* Ключ */
- sem_base
- Указатель на первый семафор в множестве (см. ниже).
- sem_nsems
- Количество семафоров в множестве. Каждый семафор в
множестве имеет целый положительный номер, называемый sem_num, и принимает последовательные значения от 0 до (sem_nsems - 1).
- sem_otime
- Время последней операции semop(2).
- sem_ctime
- Время последней операции semctl(2), которая изменила какой-либо элемент вышеописанной структуры.
Время измеряется в секундах, начиная с 00:00:00 1 января 1970 года (по Гринвичу).
Семафор - это структура, содержащая следующие элементы:
ushort semval; /* Значение семафора */
short sempid; /* Идентификатор процесса, выполнявшего последнюю операцию */
ushort semncnt; /* Число процессов, ожидающих увеличения значения семафора */
ushort semzcnt; /* Число процессов, ожидающих обнуления значения семафора */
- semval
- Неотрицательное целое число, являющееся значением
семафора.
- sempid
- Идентификатор процесса, который последним выполнял
какую-либо операцию с данным семафором.
- semncnt
- Счетчик числа процессов, ожидающих, когда значение
данного семафора станет больше его текущего значения.
- semzcnt
- Счетчик числа процессов, ожидающих, когда значение
данного семафора станет равным нулю.
Права на операции с семафорами. В описании системных
вызовов semop(2) и semctl(2) права, требуемые для операций, записаны в фигурных скобках { и }. Права состоят
в следующем:
00400 | Чтение для владельца. |
00200 | Изменение для владельца. |
00040 | Чтение для группы. |
00020 | Изменение для группы. |
00004 | Чтение для остальных. |
00002 | Изменение для остальных. |
Процессу предоставляются права на чтение и изменение
значений семафоров по идентификатору множества, если
истинно хотя бы одно из следующих условий:
- Действующий идентификатор пользователя процесса
есть идентификатор суперпользователя.
- Действующий идентификатор пользователя процесса
совпадает со значением компонента sem_perm.cuid
или sem_perm.uid структуры данных, ассоциированной
с идентификатором множества семафоров, и соответствующие биты для владельца в sem_perm.mode
(0600) равны 1.
- Действующий идентификатор группы процесса совпадает со значением компонента sem_perm.cgid или
sem_perm.gid структуры данных, ассоциированной с
идентификатором множества семафоров, и соответствующие биты для группы в sem_perm.mode (0060) равны 1.
- Соответствующие биты для прочих пользователей в
sem_perm.mode (0006) равны 1.
Если все перечисленные условия ложны, прав на соответствующую операцию с семафорами у процесса нет.
Идентификатор разделяемого сегмента памяти. Идентификатор разделяемого сегмента памяти (shmid) есть уникальное положительное целое число, возвращаемое системным
вызовом shmget(2). С каждым таким идентификатором ассоциирован сегмент памяти (называемый разделяемым сегментом) и структура данных. Заметим, что разделяемый сегмент памяти должен быть явно удален пользователем после
того, как удалена последняя ссылка на сегмент. Структура данных, обозначаемая shmid_ds, содержит следующие
компоненты:
struct ipc_perm shm_perm; /* Структура прав на выполнение операций */
int shm_segsz; /* Размер сегмента */
struct region *shm_reg; /* Указатель на структуру области памяти */
char pad[4]; /* Информация для подкачки */
ushort shm_lpid; /* Идентификатор процесса, вып. последнюю операцию */
ushort shm_cpid; /* Идентификатор процесса, создавшего сегмент */
ushort shm_nattch;/* Число процессов, подсоединивших сегмент */
ushort shm_cnattch; /* Для shminfo */
time_t shm_atime; /* Время последнего подсоединения */
time_t shm_dtime; /* Время последнего отсоединения */
time_t shm_ctime; /* Время последнего изменения */
- shm_perm
- Структура типа ipc_perm, которая определяет права
на операции с разделяемыми сегментами (см. ниже).
Эта структура содержит следующие элементы:
ushort cuid; /* Идентификатор пользователя, создавшего сегмент */
ushort cgid; /* Идентификатор группы создателя сегмента */
ushort uid; /* Идентификатор пользователя */
ushort gid; /* Идентификатор группы */
ushort mode; /* Права на чтение/изменение */
ushort seq; /* Последовательность номеров используемых слотов */
key_t key; /* Ключ */
- shm_segsz
- Размер разделяемого сегмента памяти в байтах.
- shm_lpid
- Идентификатор процесса, последним выполнившего
операцию shmop(2).
- shm_cpid
- Идентификатор процесса, создавшего идентификатор
разделяемого сегмента памяти.
- shm_nattch
- Счетчик количества процессов, к которым в данный
момент подсоединен разделяемый сегмент памяти.
- shm_atime
- Время последней операции shmat(2).
- shm_dtime
- Время последней операции shmdt(2).
- shm_ctime
- Время последней операции shmctl(2), которая изменила какой-либо элемент вышеописанной структуры.
Время измеряется в секундах, начиная с 00:00:00 1 января 1970 года (по Гринвичу).
Права на операции с разделяемыми сегментами памяти. В
описании системных вызовов shmop(2) и shmctl(2) права,
требуемые для операций, записаны в фигурных скобках { и
}. Права состоят в следующем:
00400 | Чтение для владельца. |
00200 | Запись для владельца. |
00040 | Чтение для группы. |
00020 | Запись для группы. |
00004 | Чтение для остальных. |
00002 | Запись для остальных. |
Процессу предоставляется право на чтение или запись в
разделяемый сегмент памяти, если истинно хотя бы одно
из следующих условий:
- Действующий идентификатор пользователя процесса
есть идентификатор суперпользователя.
- Действующий идентификатор пользователя процесса
совпадает со значением компонента shm_perm.cuid
или shm_perm.uid структуры данных, ассоциированной
с идентификатором разделяемого сегмента, и соответствующие биты для владельца в shm_perm.mode
(0600) равны 1.
- Действующий идентификатор группы процесса совпадает со значением компонента shm_perm.cgid или
shm_perm.gid структуры данных, ассоциированной с
идентификатором разделяемого сегмента, и соответствующие биты для группы в shm_perm.mode (0060)
равны 1.
- Соответствующие биты для прочих пользователей в
shm_perm.mode (0006) равны 1.
Если все перечисленные условия ложны, прав на соответствующую операцию с разделяемым сегментом памяти у
процесса нет.
Псевдоустройства. Набор механизмов ядра операционной
системы UNIX, поддерживающих развитие сетевых услуг и
коммуникационных драйверов, называется механизмом псевдоустройств. Он определяет стандарт интерфейса для посимвольного ввода/вывода внутри ядра и между ядром и
пользовательскими процессами. Механизм псевдоустройств
состоит из утилит, средств ядра и набора структур данных.
Поток. Поток - это полнодуплексный канал данных внутри
ядра, связывающий пользовательский процесс с драйвером.
Основными компонентами потока являются исток, драйвер и
ноль или более модулей между истоком и драйвером. Поток
аналогичен каналу в shell'е, за исключением того, что
данные в потоке перемещаются и обрабатываются в обоих
направлениях.
Исток. Исток - это компонент потока, который обеспечивает интерфейс между потоком и пользовательским процессом. Основная функция истока состоит в обработке системных вызовов, относящихся к псевдоустройствам, и в
передаче данных между пользовательским процессом и потоком.
Драйвер. В потоке драйвер обеспечивает интерфейс между
периферийным оборудованием и потоком. Драйвер может
быть и псевдодрайвером, таким как мультиплексор или
драйвер ошибок [см. log(7)], которые не связаны с реальным устройством.
Модуль. Модуль - это компонент потока, содержащий программы обработки входных и выходных данных. Он всегда
располагается в середине потока, между истоком и драйвером. Для псевдоустройств модули играют ту же роль,
что и команды в конвейере shell'а, с тем существенным
отличием, что модуль содержит пару функций, позволяющих
независимо передавать (и обрабатывать) данные в двух
направлениях - вниз и вверх.
Вниз. В потоке - направление от истока к драйверу.
Вверх. В потоке - направление от драйвера к истоку.
Сообщение. В потоке сообщение - это один или более блоков данных вместе с управляющими структурами псевдоустройства. Определено несколько типов сообщений; тип
идентифицирует содержание сообщения. Механизм сообщений
- единственный способ передачи данных в потоке.
Очередь сообщений. В потоке очередь сообщений - это
список сообщений, ожидающих обработки модулем или драйвером.
Очередь чтения. В потоке очередь чтения - это очередь
сообщений, направленных вверх.
Очередь записи. В потоке очередь записи - это очередь
сообщений, направленных вниз.
Мультиплексор. Мультиплексор - это драйвер, позволяющий
потокам, ассоциированным с несколькими пользовательскими процессами, подсоединиться к одному драйверу или же
нескольким драйверам подсоединиться к одному пользовательскому процессу. Механизм псевдоустройств не предоставляет универсальный мультиплексор, но содержит все
необходимые средства для создания мультиплексоров и
связывания мультиплексированных потоков.
ПРИМЕЧАНИЯ
Информацию, относящуюся к системе разделения удаленных
файлов (РУФ), следует принимать во внимание, только если на Вашей установке есть соответствующее аппаратное и
программное обеспечение; в стандартную конфигурацию оно
не входит.
СМ. ТАКЖЕ
intro(3).