Лекция №4
Struct msgbuf
Struct sembuf
Семафоры.
int semget (key_t key,
int count,
int flags)
Все тоже, что и с общей памятью, кроме второго параметра.
int semop (int id,
struct sembuf *sops,
unsigned nops)
{
unsigned short sem_num;
short sem_op;
short sem_flg;
}
Функция работает с семафорами.
- занять ресурсы
- отдать ресурсы
*sops – указатель на первый элемент массива.
nops – количество элементов в массиве
Массив состоит из структур:
sem_num – номер семафора внутри группы,
sem_op – число (если > 0, то его прибавить к счетчику семафоров)
Флаги: IPC_NOWAIT – не ждать sem_op
IPC_UNDO – после завершения процесса – самооткат данной операции с данным семафором.
int semctl (int id,
int semnum,
int cmd,…)
CMD: IPC_RMID – уничтожить группу семафоров.
Критическая секция – это семафор с максимальным значением счетчика = 1
int msgget (key_t key, int flags) 0 создать очередь сообщений.
Отправляет сообщение в очередь:
int msgsnd (
int id,
struct msgbuf *buf
size_t size,// указатель на размер данных в struct без поля mtype
int flags// - 0 или IPC_NOWAIT - не ждать, если очередь переполнена)
{
long mtype;// служебное поле, число > 0
char mtext[1];// после идут любые данные любого размера, которые
//нужно отправить в очередь
}
Читает из очереди одно сообщение:
size_t msgrev (int id, // очередь сообщений
struct msgbuf *buf,// указатель на структуру
size_t size, // размер структуры
long mtype,
int flags // IPC_NOWAIT – не ждать, если в очереди нет сообщения)
mtype | данные |
… | |
… | |
… | |
… | |
… | |
… | |
… | |
… | |
… |
- фильтрует сообщения
mtype = 0 – сообщения выбираются подряд
mtype > 0 – выбирается сообщение, у которого поле
mtype совпадает со значением mtype в структуре
mtype < 0 – выбирается сообщение, у которого mtype ≤
|mtype|
MSG_NOERROR – если длина сообщения > буфера – обрезать сообщение и ошибку не возвращать.
int msgctl (int id,
int cmd, // IPC_PMID – уничтожить очередь сообщений
struct msgid_ds *buf)
Открывает доступ к файлу:
int open (
const char* path. // путь
int flags
[, mode_t mode])// режим доступа (0666 - 110110110)
Флаги:
O_CREAT | создать файл, если он существует, просто его открыть |
O_CREAT+O_EXCE | обязательно создать, если он есть, то это ошибка |
O_RDONLY | только чтение |
O_TRUNC | открыть файл и обрезать его содержимое |
O_RWONLY | только запись |
O_APPEND | в режиме добавления. Перед каждой записью указатель устанавливается в конец файла |
O_RDWR | чтение и запись |
O_DIRECT | минимизировать, т.е. не кэшировать |
O_NOFOLLOW | не следовать по ссылке, если путь открытия файла – ссылка. |
int creat (
const char* path,
mode_t mode) – возвращает при открытии дескриптор файла.
ssize_t read (int fd,
void *buf,
size_t count)
ssize_t write (int fd,
void *buf,
size_t count)
fd – файловый дескриптор, возвращенный int creat()
Результат функции = -1 – если ошибка.
off_t lseek (int fd,
off_t offset,
int from)
fd – файловый дескриптор
offset – расстояние смещения:
SEEK_SET – от начала
SEEK_CUR – с текущего положения
SEEK_END – от конца
from – точка отсчета смещения