Similar presentations:
Многопоточное программирование (Лекция №5). IPC, SysV
1. Многопоточное программирование
Лекция №5Многопоточное
программирование
Дмитрий Калугин-Балашов
2. IPC
msggetmsgctl
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
msggetmsgctl
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
idSysV
Object
4
5. SysV
idSysV
Object
id
5
6. SysV
idSysV
Object
fork()
id
6
7. SysV
id = constSysV
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)
88
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
msggetmsgctl
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
strPOSIX
Object
str
1
5
16. IPC
msggetmsgctl
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
msggetmsgctl
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_CREATint msgget(key_t key, int flags);
IPC_CREAT
ftok(…);
IPC_CREAT
1
8
19. Очереди сообщений (SysV)
O_CREATint 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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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
msggetmsgctl
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. Передача дескрипторов
69
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