Многопоточное программирование
IPC
IPC
SysV
SysV
SysV
SysV
SysV (ftok)
SysV (ftok)
SysV (ipcs)
SysV (ipcrm)
SysV (Права доступа)
SysV (Права доступа)
IPC
SysV
IPC
IPC
Очереди сообщений (SysV)
Очереди сообщений (SysV)
Очереди сообщений (SysV)
Очереди сообщений (SysV)
Очереди сообщений (SysV)
Очереди сообщений (SysV)
Очереди сообщений (SysV)
IPC
Очереди сообщений (POSIX)
Очереди сообщений (POSIX)
Очереди сообщений (POSIX)
Очереди сообщений (POSIX)
Очереди сообщений (POSIX)
Очереди сообщений (POSIX)
IPC
IPC
Семафоры (POSIX)
Семафоры (POSIX)
Семафоры (POSIX)
Семафоры (POSIX)
Семафоры (POSIX)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
Семафоры (SysV)
IPC
Семафоры (POSIX)
Семафоры (POSIX)
IPC
Семафоры (POSIX)
IPC
IPC
Общая память (SysV)
Общая память (SysV)
IPC
Отображение файлов в память
IPC
Отображение файлов в память
IPC
Таймеры
Таймеры
Таймеры
Передача дескрипторов
Передача дескрипторов
Передача дескрипторов
Передача дескрипторов
Передача дескрипторов
373.19K
Категория: ПрограммированиеПрограммирование

Многопоточное программирование (Лекция №5). IPC, SysV

1. Многопоточное программирование

Лекция №5
Многопоточное
программирование
Дмитрий Калугин-Балашов

2. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

2

3. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

3

4. SysV

id
SysV
Object
4

5. SysV

id
SysV
Object
id
5

6. SysV

id
SysV
Object
fork()
id
6

7. SysV

id = const
SysV
Object
id = const
7

8. SysV (ftok)

id = ftok(const char *pathname, int proj_id);
SysV
Object
id = ftok(const char *pathname, int proj_id);
8

9. SysV (ftok)

8
8
id = ftok(const char *pathname, int proj_id);
SysV
Object
1
1
2
3
4
5
2
2
3
4
5
6
5
4
3
2
1
3
16
9

10. SysV (ipcs)

Вывод ipcs.
1.
2.
------ Shared Memory Segments -------key
shmid
owner
perms
status
3.
4.
5.
------ Semaphore Arrays -------key
semid
owner
perms
0x002fa327 0
root
666
6.
7.
------ Message Queues -------key
msqid
owner
messages
perms
bytes
nattch
nsems
2
used-bytes
1
0

11. SysV (ipcrm)

Использование ipcrm.
1.
2.
ipcrm –M shmkey
ipcrm –m shmid
3.
4.
ipcrm –Q msgley
ipcrm –q msgid
5.
6.
ipcrm –s semkey
ipcrm –S semid
1
1

12. SysV (Права доступа)

• Обладают идентификаторам
пользователя и группы
• Группы – означает создателя
• Девять бит – rwxrwxrwx
• Бит x не имеет смысла
1
2

13. SysV (Права доступа)

ipc_perm.
1.
2.
3.
4.
5.
6.
7.
struct ipc_perm {
uid_t uid;
gid_t gid;
uid_t cuid;
git_t cgid;
mode_t mode;
}
1
3

14. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

1
4

15. SysV

str
POSIX
Object
str
1
5

16. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

1
6

17. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

1
7

18. Очереди сообщений (SysV)

O_CREAT
int msgget(key_t key, int flags);
IPC_CREAT
ftok(…);
IPC_CREAT
1
8

19. Очереди сообщений (SysV)

O_CREAT
int msgget(key_t key, int flags);
IPC_CREAT
r w x r w x r w x
ftok(…);
IPC_PRIVATE
IPC_CREAT
1
9

20. Очереди сообщений (SysV)

msgctl.
1.
2.
3.
int msgctl(int msgq,
int cmd /* IPC_SET, IPC_STAT, IPC_RMID */,
struct msqid_ds *data);
4. struct msqid_ds {
5.
struct ipc_perm msg_perm {
6.
7.
8.
9.
10.
11.
12.
13.
14. }
uid_t uid; gid_t gid;
uid_t cuid; git_t cgid;
mode_t mode;
}
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid, msg_lrpid;
time_t msg_stime, msg_rtime, msg_ctime;
2
0

21. Очереди сообщений (SysV)

msgsnd/msgrcv.
1. int msgsnd(int msgid,
2.
const void *msgp,
3.
size_t msgsz,
4.
int msgflg);
5. int msgrcv(int msgid,
6.
void *msgp,
7.
size_t msgsz,
8.
long msgtyp,
9.
int msgflg);
10. struct msg {
11.
long mtype;
12.
char mtext[MTEXTSIZE];
13. }
2
1

22. Очереди сообщений (SysV)

msgsnd/msgrcv.
1. int msgsnd(int msgid,
2.
const void *msgp,
3.
size_t msgsz,
4.
int msgflg);
5. int msgrcv(int msgid,
6.
void *msgp,
7.
size_t msgsz,
8.
long msgtyp,
9.
int msgflg);
10. struct msg {
11.
long mtype;
12.
char mtext[MTEXTSIZE];
13. }
2
2

23. Очереди сообщений (SysV)

msgsnd/msgrcv.
1. int msgsnd(int msgid,
2.
const void *msgp,
3.
size_t msgsz,
4.
int msgflg);
5. int msgrcv(int msgid,
6.
void *msgp,
7.
size_t msgsz,
8.
long msgtyp,
9.
/* ‘=0’ – Any, ‘>0’ – Current, ‘<0’ - <= abs(Current) */
10.
int msgflg);
11. struct msg {
12.
long mtype; // Not 0
13.
char mtext[MTEXTSIZE];
14. }
2
3

24. Очереди сообщений (SysV)

msgsnd/msgrcv.
1. int msgsnd(int msgid,
2.
const void *msgp,
3.
size_t msgsz,
4.
int msgflg);
5. int msgrcv(int msgid,
6.
void *msgp,
7.
size_t msgsz,
8.
long msgtyp,
9.
/* ‘=0’ – Any, ‘>0’ – Current, ‘<0’ - <= abs(Current) */
10.
int msgflg); // MSG_NOERROR, IPC_NOWAIT => EAGAIN
11. struct msg {
12.
long mtype; // Not 0
13.
char mtext[MTEXTSIZE];
14. }
2
4

25. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

2
5

26. Очереди сообщений (POSIX)

mq_open.
1.
2.
3.
4.
5.
6.
7.
8.
mqd_t mq_open(const char *name,
int flags);
// O_RDONLY, O_WRONLY, O_RDWR, O_NONBLOCK
mqd_t mq_open(const char *name,
int flags,
mode_t perms,
struct mq_attr *attr);
// + O_CREAT, O_EXCL
9. int mq_getattr(mqd_t mqd,
10.
struct mq_attr *attr);
11. int mq_setattr(mqd_t mqd,
12.
const struct mq_attr *attr,
13.
struct mq_attr *oldattr);
2
6

27. Очереди сообщений (POSIX)

mq_attr.
1. struct mq_attr {
2.
long mq_flags;
3.
long mq_maxmsg;
4.
long mq_msgsize;
5.
long mq_curmsg;
6. }
2
7

28. Очереди сообщений (POSIX)

mq_close/mq_unlink.
1. int mq_close(mqd_t mqd);
2. int mq_unlink(const char *name);
2
8

29. Очереди сообщений (POSIX)

mq_send/mq_receive.
1. int mq_send(mqd_t mqd,
2.
const char *msg,
3.
size_t msgsize,
4.
unsigned priority /* 0..31..> */);
5. ssize_t mq_receive(mqd_t mqd,
6.
char *msg,
7.
size_t msgsize,
8.
unsigned *priorityp);
2
9

30. Очереди сообщений (POSIX)

mq_timedsend/mq_timedreceive.
1. int mq_timedsend(mqd_t mqd,
2.
const char *msg,
3.
size_t msgsize,
4.
unsigned priority,
5.
const struct timespec *tmout);
6. ssize_t mq_timedreceive(mqd_t mqd,
7.
char *msg,
8.
size_t msgsize,
9.
unsigned *prtorityp,
10.
const struct timespec *tmout);
3
0

31. Очереди сообщений (POSIX)

mq_notify.
1. int mq_notify(
2.
mqd_t mqd,
3.
const struct sigevent *ep);
4. // 1. После вызова mq_notify: извлечь все сообщения из очереди
5.
(O_NONBLOCK).
// 2. После прибытия сигнала:
(1).
Вызвать mq_notify и выполнить
3
1

32. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

3
2

33. IPC

msgget
msgctl
msgsnd
msgrcv
semget
semctl
semop
Семафоры
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

3
3

34. Семафоры (POSIX)

semget.
1. int semget(key_t key, int nsems, int flags);
3
4

35. Семафоры (POSIX)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
3
5

36. Семафоры (POSIX)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3
6

37. Семафоры (POSIX)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
3.
4.
5.
6.
*array; }
struct semid_ds {
struct ipc_perm sem_perm;
unsigned short sem_nsems;
time_t sem_otime; time_t sem_ctime; }
3
7

38. Семафоры (POSIX)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
3
8

39. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
3
9

40. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, int cmd, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
4
0

41. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, IPC_RMID, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
4
1

42. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, IPC_STAT, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
4
2

43. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, IPC_SET, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
4
3

44. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, GETNCNT, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Получить количество процессов, ожидающих увеличения
значения семафора.
4
4

45. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, GETZCNT, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Получить количество процессов, ожидающих, пока значение
семафора не достигнет нуля.
4
5

46. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, GETPID, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Получить PID последнего, обратившегося в semop, процесса.
4
6

47. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, GETVAL, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Получить значение семафора.
4
7

48. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, SETVAL, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Установить значение семафора.
4
8

49. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, GETALL, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Получить значение всех семафоров.
4
9

50. Семафоры (SysV)

semctl.
1. int semctl(int semid, int semnum, SETALL, union semun arg);
2. union semun { int val; struct semid_ds *buf; unsigned short
*array; }
3. struct semid_ds {
4.
struct ipc_perm sem_perm;
5.
unsigned short sem_nsems;
6.
time_t sem_otime; time_t sem_ctime; }
7. struct ipc_perm {
8.
uid_t uid; gid_t gid;
9.
uid_t cuid; git_t cgid;
10.
mode_t mode; }
11. // Установить значение всех семафоров.
5
0

51. Семафоры (SysV)

semop.
1. int semop(int semid, struct sembuf *sops, size_t nsops);
2. struct sembuf {
3.
unsigned short sem_num;
4.
short sem_op;
5.
short sem_flg; }
6. sem_op > 0 – добавляем semop к значению семафора
7. sem_op < 0 – ждем, пока значение семафора меньше |sem_op|,
8.
потом его вычитаем
sem_op = 0 – ждем, пока значением семафора не 0
9. IPC_NOWAIT
10. IPC_UNDO
5
1

52. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

5
2

53. Семафоры (POSIX)

sem_open/sem_close/sem_unlink.
1.
2.
3.
4.
5.
6.
7.
sem_t *sem_open(const char *name, int flags);
sem_t *sem_open(const char *name,
int flags,
mode_t perms,
unsigned value);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);
5
3

54. Семафоры (POSIX)

Работа с семафором.
1.
2.
3.
4.
5.
int
int
int
int
sem_post(sem_t *sem); // +1
sem_wait(sem_t *sem); // -1
sem_trywait(sem_t *sem); // Like O_NONBLOCK or IPC_NOWAIT
sem_timedwait(sem_t *restrict sem,
const struct timespec *time);
6. int sem_getvalue(sem_t *restrict sem,
7.
int *valuep);
5
4

55. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

5
5

56. Семафоры (POSIX)

sem_init/sem_destroy.
1. int sem_init(sem_t *sem, int pshared, unsigned value);
2. int sem_destroy(sem_t *sem);
5
6

57. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

5
7

58. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

5
8

59. Общая память (SysV)

Создание и управление.
1. int shmget(key_t key, size_t size, int flags);
2. int shmctl(int shmid, int cmd, struct shmid_ds *data);
3. struct shmid_ds {
4.
struct ipc_perm shm_perm;
5.
size_t shm_segsz;
6.
pid_t shm_lpid;
7.
pid_t shm_cpid;
8.
shmatt_t shm_nattch;
9.
time_t shm_atime;
10.
time_t shm_dtime;
11.
time_t shm_ctime; }
5
9

60. Общая память (SysV)

Присоединение и отсоединение.
1. void *shmat(int shmid,
2.
const void *shmaddr /* EINVAL */,
3.
int flags /* SHM_RND, SHM_RDONLY */);
4. int shmdt(const void *shmaddr);
6
0

61. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

6
1

62. Отображение файлов в память

mmap/munmap.
1. void *mmap(
2.
void *addr,
3.
size_t len,
4.
int prot, // PROT_NONE, PROT_READ, PROT_WRITE, PROT_EXEC
5.
int flags, // MAP_PRIVATE, MAP_SHARED, MAP_FIXED,
6.
7.
MAP_ANONYMOUS
int fd,
off_t off);
8. int munmap(
9.
void *addr,
10.
size_t len);
6
2

63. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

6
3

64. Отображение файлов в память

shm_open/shm_unlink.
1. int shm_open(
2.
const char *name,
3.
int flags,
4.
mod_t perms
5. );
6. int ftruncate(int fd, off_t length);
7. shm_unlink(const char *name);
6
4

65. IPC

msgget
msgctl
msgsnd
msgrcv
Очереди сообщений
mq_open
mq_close
mq_unlink
mq_send
mq_receive

shmget
shmctl
shmat
shmdt
SysV
semget
semctl
semop
Семафоры
sem_open
sem_close
sem_unlink
sem_wait
sem_post

POSIX
sem_init
sem_destroy
Общая память
shm_open
shm_unlink
mmap
munmap

6
5

66. Таймеры

Будильник.
1.
unsigned alarm(unsigned secs);
6
6

67. Таймеры

Сон.
1. unsigned sleep(unsigned secs);
2. unsigned usleep(useconds_t usecs);
3. unsigned nanosleep(const struct timespec *nsecs,
4.
struct timespec *remain);
5. tv_sec
6. tv_nsec
6
7

68. Таймеры

Виды таймеров.
1. ITIMER_REAL – реальное время, SIGALRM
2. ITIMER_VIRTUAL – виртуальное время, SIGVTALRM
3. ITIMER_PROF – время работы в процессе + время работы в ядре от
имени процесса, SIGPROF
4. int getitimer(int which, struct itimerval *val);
5. int settimer(int which, const struct itimerval *val,
6.
struct itimerval *oval);
7. struct itimerval { struct timeval it_interval, it_value);
6
8

69. Передача дескрипторов

6
9

70. Передача дескрипторов

sendmsg/recvmsg.
1. ssize_t sendmsg(int sockfd, const struct msghdr *msg, int
2.
flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct iovec {
void *iov_base;
size_t iov_len;
};
struct msghdr {
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
size_t msg_iovlen;
void *msg_control;
size_t msg_controllen;
int msg_flags;
};
7
0

71. Передача дескрипторов

cmsghdr.
1. struct cmsghdr {
2.
socklen_t cmsg_len; /* счетчик байтов данных с заголовком
*/
3.
int cmsg_level; /* создаваемый протокол передачи */
4.
int cmsg_type; /* тип, зависящий от протокола */
5.
/* с последующей переменной без знакаc msg_data[]; */
6. };
7
1

72. Передача дескрипторов

Макросы.
1. struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *msgh);
2. struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct
3.
4.
5.
6.
cmsghdr *cmsg);
size_t CMSG_ALIGN(size_t length);
size_t CMSG_SPACE(size_t length);
size_t CMSG_LEN(size_t length);
unsigned char *CMSG_DATA(struct cmsghdr *cmsg);
7
2

73. Передача дескрипторов

Пример.
1. http://keithp.com/blogs/fd-passing/
7
3

74.

Домашнее
задание №
2
Реализовать в web-сервере возможность параллельного
исполнения запросов (с помощью воркеров - дочерних
процессов или потоков)
Добавить в параметры сервера опцию –w – число
воркеров.
Воркеры должны нагружаться равномерно (можно
проверить с помощью нагрузочного теста).
Парсинг параметров не должен быть ручным (можно
использовать getopt)
Логи необходимо писать в syslog.
Срок сдачи
Последнее занятие
7
4
English     Русский Правила