Архитектура операционной системы UNIX (ЛП)
Архитектура операционной системы UNIX (ЛП) читать книгу онлайн
Настоящая книга посвящена описанию внутренних алгоритмов и структур, составляющих основу операционной системы (т. н. «ядро»), и объяснению их взаимосвязи с программным интерфейсом. Таким образом, она будет полезна для работающих в различных операционных средах. При работе с книгой было бы гораздо полезнее обращаться непосредственно к исходному тексту системных программ, но книгу можно читать и независимо от него. Во-вторых, эта книга может служить в качестве справочного руководства для системных программистов, из которого последние могли бы лучше уяснить себе механизм работы ядра операционной системы и сравнить между собой алгоритмы, используемые в UNIX, и алгоритмы, используемые в других операционных системах. Наконец, программисты, работающие в среде UNIX, могут углубить свое понимание механизма взаимодействия программ с операционной системой и посредством этого прийти к написанию более эффективных и совершенных программ.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
pid = 0 сигнал посылается процессам, групповой идентификатор которых совпадает с идентификатором отправителя
pid = -1 если процесс-отправитель исполняется под идентификатором суперпользователя, сигнал посылается всем процессам, в противном случае, сигнал посылается процессам, фактический код идентификации пользователя у которых совпадает с идентификатором суперпользователя
pid ‹ -1 сигнал посылается процессам, групповой идентификатор которых совпадает с pid
Исполнительный код идентификации пользователя процесса-отправителя должен указывать на суперпользователя, в противном случае, фактический или исполнительный коды идентификации отправителя должны совпадать с соответствующими кодами процессов-получателей.
link
link(filename1, filename2)
char *filename1,*filename2;
Функция link присваивает файлу filename1 новое имя filename2. Файл становится доступным под любым из этих имен.
lseek
lseek(fildes, offset, origin)
int fildes, origin;
long offset;
Функция lseek изменяет положение указателя чтения-записи для файла с дескриптором fildes и возвращает новое значение. Положение указателя зависит от значения параметра origin:
0 установить указатель на позицию, соответствующую указанному смещению в байтах от начала файла
1 сдвинуть указатель с его текущей позиции на указанное смещение
2 установить указатель на позицию, соответствующую указанному смещению в байтах от конца файла
мknod
mknod(filename, modes, dev)
char *filename;
int mode, dev;
Функция mknod создает специальный файл, каталог или поименованный канал (очередь по принципу "первым пришел — первым вышел") в зависимости от значения параметра modes:
010000 поименованный канал
020000 специальный файл устройства ввода-вывода символами
040000 каталог
060000 специальный файл устройства ввода-вывода блоками
12 младших разрядов параметра modes имеют тот же самый смысл, что и в функции chmod. Если файл имеет специальный тип, параметр dev содержит старший и младший номера устройства.
мount
mount(specialfile, dir, rwflag)
char *specialfile, *dir;
int rwflag;
Функция mount выполняет монтирование файловой системы, на которую указывает параметр specialfile, в каталоге dir. Если младший бит параметра rwflag установлен, файловая система монтируется только для чтения.
мsgctl
#include ‹sys/types.h›
#include ‹sys/ipc.h›
#include ‹sys/msg.h›
msgctl(id, cmd, buf)
int id, cmd;
struct msgid_ds *buf;
В зависимости от операции, указанной в параметре cmd, функция msgctl дает процессам возможность устанавливать или запрашивать информацию о статусе очереди сообщений с идентификатором id, а также удалять очередь из системы. Структура msquid_ds определена следующим образом:
struct ipc_perm {
ushort uid; /* идентификатор текущего пользователя */
ushort gid; /* идентификатор текущей группы */
ushort cuid; /* идентификатор пользователя-создателя */
ushort cgid; /* идентификатор группы создателя */
ushort mode; /* права доступа */
short pad1; /* используется системой */
long pad2; /* используется системой */
};
struct msquid_ds {
struct ipc_perm msg_perm; /* структура, описывающая права доступа */
short pad1[7]; /* используется системой */
ushort msg_qnum; /* количество сообщений в очереди */
ushort msg_qbytes; /* максимальный размер очереди в байтах */
ushort msg_lspid; /* идентификатор процесса, связанного с последней посылкой сообщения */
ushort msg_lrpid; /* идентификатор процесса, связанного с последним получением сообщения */
time_t msg_stime; /* время последней посылки сообщения */
time_t msg_rtime; /* время последнего получения сообщения */
time_t msg_ctime; /* время последнего изменения */
};
Типы операций:
IPC_STAT Прочитать в буфер заголовок очереди сообщений, ассоциированный с идентификатором id
IPC_SET Установить значения переменных msg_perm.uid, msg_perm.gid, msg_perm.mode (9 младших разрядов структуры msg_perm) и mgr_qbytes в соответствии со значениями, содержащимися в буфере
IPC_RMID Удалить из системы очередь сообщений с идентификатором id
мsgget
#include ‹sys/types.h›
#include ‹sys/ipc.h›
#include ‹sys/msg.h›
msgget(key, flag)
key_t key;
int flag;
Функция msgget возвращает идентификатор очереди сообщений, имя которой указано в key. Параметр key может указывать на то, что возвращаемый идентификатор относится к частной очереди (IPC_PRIVATE), в этом случае создается новая очередь сообщений. С помощью параметра flag можно сделать указание о необходимости создания очереди (IPC_CREAT), а также о том, что создание очереди должно выполняться монопольно (IPC_EXCL). В последнем случае, если очередь уже существует, функция msgget дает отказ.
мsgsnd и msgrcv
#include ‹sys/types.h›
#include ‹sys/ipc.h›
#include ‹sys/msg.h›
msgsnd(id, msgp, size, flag)
int id, size, flag;
struct msgbuf *msgp;
msgrcv(id, msgp, size, type, flag)
int id, size, type, flag;
struct msgbuf *msgmp;
Функция msgsnd посылает сообщение указанного размера в байтах (size) из буфера msgp в очередь сообщений с идентификатором id. Структура msgbuf определена следующим образом:
struct msgbuf {
long mtype;
char mtext[];
};
Если в параметре flag бит IPC_NOWAIT сброшен, функция msgsnd будет приостанавливаться в тех случаях, когда размер отдельного сообщения или число сообщений в системе превышают допустимый максимум. Если бит IPC_NOWAIT установлен, функция msgsnd в этих случаях прерывает свое выполнение. Функция msgrcv принимает сообщение из очереди с идентификатором id. Если параметр type имеет нулевое значение, из очереди будет выбрано сообщение, первое по счету; если положительное значение, из очереди выбирается первое сообщение данного типа; если отрицательное значение, из очереди выбирается сообщение, имеющее самый младший тип среди тех типов, значение которых не превышает абсолютное значение параметра type. В параметре size указывается максимальный размер сообщения, ожидаемого пользователем. Если в параметре flag установлен бит MSG_NOERROR, в том случае, когда размер получаемого сообщения превысит предел, установленный параметром size, ядро обрежет это сообщение. Если же соответствующий бит сброшен, в подобных случаях функция будет возвращать ошибку. Если в параметре flag бит IPC_NOWAIT сброшен, функция msgrcv приостановит свое выполнение до тех пор, пока сообщение, удовлетворяющее указанному в параметре type условию, не будет получено. Если соответствующий бит сброшен, функция завершит свою работу немедленно. Функция msgrcv возвращает размер полученного сообщения (в байтах).
niсе
nice(increment)
int increment;
Функция nice увеличивает значение соответствующей компоненты, участвующей в вычислении приоритета планирования текущего процесса, на величину increment. Увеличение значения nice ведет к снижению приоритета планирования.
оpen
#include ‹fcntl.h›
open(filename, flag, mode)
char *filename;
int flag, mode;
Функция open выполняет открытие указанного файла в соответствии со значением параметра flag. Значение параметра flag представляет собой комбинацию из следующих разрядов (причем из первых трех разрядов может быть использован только один):
O_RDONLY открыть только для чтения
O_WRONLY открыть только для записи
O_RDWR открыть для чтения и записи
O_NDELAY если файл является специальным файлом устройства, функция возвращает управление, не дожидаясь ответного сигнала; если файл является поименованным каналом, функция в случае неудачи возвращает управление немедленно (с индикацией ошибки, когда бит O_WRONLY установлен), не дожидаясь открытия файла другим процессом