Π ΠΈΡ. 10.13. ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² Π±ΡΡΠ΅ΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π½ΠΈΡΡΡΡ Π½Π΅ ΡΡΠΊΠΎΡΠΈΠ»ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ΅Π»ΠΎΠΌ. ΠΡ Π½Π΅ Π²ΡΠΈΠ³ΡΠ°Π»ΠΈ Π² ΡΠΊΠΎΡΠΎΡΡΠΈ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ).
Π ΡΡΠΈΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°Ρ ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ½ΠΊΠΎΡΡΠ΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΠ΄Π΅Ρ Unix Π²ΡΡΠ²Π»ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΡΠΏΡΠ΅ΠΆΠ΄Π°ΡΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ Π΅ΡΠ΅ Π΄ΠΎ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΡΠΈΡΡΠ²Π°ΡΡΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π½Π° Π½Π°ΡΠΈ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² ΡΠ΄ΡΠ΅.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²) ΠΈ Π΄Π²ΡΡ Π±ΡΡΠ΅ΡΠΎΠ². ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ; ΡΡ Π΅ΠΌΠ° Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΡΠΈΡ. 10.14.
Π ΠΈΡ. 10.14. ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Ρ Π΄Π²ΡΠΌΡ Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ
ΠΠ° Π½Π°ΡΠ΅ΠΌ ΡΠΈΡΡΠ½ΠΊΠ΅ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ΅ΡΠ²ΡΠΉ Π±ΡΡΠ΅Ρ, Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π±Π΅ΡΠ΅Ρ ΠΈΡ ΠΈΠ· Π²ΡΠΎΡΠΎΠ³ΠΎ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠ° ΡΠΈΡ. 10.15 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ° Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. Π‘ΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΡΠ΅Ρ β 1, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π±ΡΡΠ΅Ρ Π³ΠΎΡΠΎΠ² ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅. ΠΠ°ΡΠ΅ΠΌ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΡΠ΅Ρ β 2, Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π±Π΅ΡΠ΅Ρ ΠΈΡ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° β 1.
Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ ΡΠΊΠΎΡΠΎΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΡΡ Π΄Π²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΆΠ΄Π°ΡΡ Π΄Π²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠ°Π·Π½ΠΈΡΡ Π² ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ Π³ΠΈΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎΠ»Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΎ ΠΏΠΎΡΡΠΈ Π²Π΄Π²ΠΎΠ΅.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ°ΠΊ Π±ΡΡΡΡΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ½ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ°ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π² 2 Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ»ΠΎ 9 Π΅Π΄ΠΈΠ½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (ΡΠΈΡ. 10.10 ΠΈ 10.13). ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π²ΡΠ³ΠΎΠ΄Π½ΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌΠΈ ΡΠΈΠΏΠ° Π½Π°ΠΊΠΎΠΏΠΈΡΠ΅Π»Π΅ΠΉ Π½Π° ΠΌΠ°Π³Π½ΠΈΡΠ½ΠΎΠΉ Π»Π΅Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅, Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ (ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΌ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ β streaming mode).
Π ΠΈΡ. 10.15. ΠΡΠΎΡΠ΅ΡΡ Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΡΠΎ Π·Π°Π΄Π°ΡΠ° Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π»ΠΈΡΡ ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΎΠ±ΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΠ΅ΡΠΎΠ². ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 10.11, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ. ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄Π²ΠΎΠΉΠ½ΡΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, Π° ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π±ΡΡΠ΅ΡΠΎΠ² (Π·Π°Π΄Π°Π΅ΡΡΡ NBUFF). Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.18 Π΄Π°Π½Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ main.
ΠΠΈΡΡΠΈΠ½Π³ 10.18. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ main//pxsem/mycat2.c
1 #include "unpipc.h"
2 #define NBUFF 8
3 struct { /* ΠΎΠ±ΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ */
4 struct {
5 char data[BUFFSIZE]; /* Π±ΡΡΠ΅Ρ */
6 ssize_t n; /* ΠΎΠ±ΡΠ΅ΠΌ Π±ΡΡΠ΅ΡΠ° */
7 } buff[NBUFF]; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±ΡΡΠ΅ΡΠΎΠ² */
8 sem_t mutex, nempty, nstored; /* ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π° Π½Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ */
9 } shared;
10 int fd; /* Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌΡΠΉ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π° */
11 void *produce(void *), *consume(void *);
12 int
13 main(int argc, char **argv)
14 {
15 pthread_t tid_produce, tid_consume;
16 if (argc != 2)
17 err_quit("usage: mycat2 <pathname>");
18 fd = Open(argv[1], O_RDONLY);
19 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² */
20 Sem_init(&shared.mutex, 0, 1);
21 Sem_init(&shared.nempty, 0, NBUFF);
22 Sem_init(&shared.nstored, 0, 0);
23 /* ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ, ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ */
24 Set_concurrency(2);
25 Pthread_create(&tid_produce, NULL, produce, NULL); /* reader thread */
26 Pthread_create(&tid_consume, NULL, consume, NULL); /* writer thread */
27 Pthread_join(tid_produce, NULL);
28 Pthread_join(tid_consume, NULL);
29 Sem_destroy(&shared.mutex);
30 Sem_destroy(&shared.nempty);
31 Sem_destroy(&shared.nstored);
32 exit(0);
33 }
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π±ΡΡΠ΅ΡΠΎΠ²2-9 Π‘ΡΡΡΠΊΡΡΡΠ° shared ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ buff, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° ΠΈ Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ°. ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ NBUFF ΡΠ°ΠΊΠΈΡ Π±ΡΡΠ΅ΡΠΎΠ².
ΠΡΠΊΡΡΡΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°18 ΠΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π°.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.19 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ produce ΠΈ consume.
ΠΠΈΡΡΠΈΠ½Π³ 10.19. Π€ΡΠ½ΠΊΡΠΈΠΈ produce ΠΈ consume//pxsem/mycat2.c
34 void *
35 produce(void *arg)
36 {
37 int i;
38 for (i = 0;;) {
39 Sem_wait(&shared.nempty); /* ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠ° Π² Π±ΡΡΠ΅ΡΠ΅ */
40 Sem_wait(&shared.mutex);
41 /* ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ */
42 Sem_post(&shared.mutex);
43 shared.buff[i].n = Read(fd, shared.buff[i].data, BUFFSIZE);
44 if (shared.buff[i].n == 0) {
45 Sem_post(&shared.nstored); /* Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ */
46 return(NULL);
47 }
48 if (++i >= NBUFF)
49 i = 0; /* ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ Π±ΡΡΠ΅Ρ */
50 Sem_post(&shared.nstored); /* Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ */
51 }
52 }
53 void *
54 consume(void *arg)
55 {
56 int i;
57 for (i = 0;;) {
58 Sem_wait(&shared.nstored); /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ */
59 Sem_wait(&shared.mutex);
60 /* ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ */
61 Sem_post(&shared.mutex);
62 if (shared.buff[i].n == 0)
63 return(NULL);
64 Write(STDOUT_FILENO, shared.buff[i].data, shared.buff[i].n);
65 if (++i >= NBUFF)
66 i=0; /* ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ Π±ΡΡΠ΅Ρ */
67 Sem_post(&shared.nempty); /* ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° */
68 }
69 }
ΠΡΡΡΠ°Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ40-42 ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ, Π·Π°ΡΠΈΡΠ°Π΅ΠΌΠ°Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ mutex, Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΡΡΠ°. ΠΡΠ»ΠΈ Π±Ρ Π±ΡΡΠ΅ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ»ΠΈ ΡΠΎΠ±ΠΎΠΉ ΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π·Π΄Π΅ΡΡ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ΄Π°Π»ΡΡΡ Π±ΡΡΠ΅Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ. ΠΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π³Π΄Π΅ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ Π±ΡΡΠ΅ΡΡ Ρ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ, Π·Π°ΡΠΈΡΠ°ΡΡ Π½Π°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΠ΅Π³ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΌΡ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π² Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡΡ ΠΊΠΎΠ΄Π°.
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° nstored43-49 ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΡΡΠΎΠΉ Π±ΡΡΠ΅Ρ, ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ read. ΠΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΈΠ· read ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ nstored, ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π±ΡΡΠ΅Ρ Π³ΠΎΡΠΎΠ². ΠΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ read Π·Π½Π°ΡΠ΅Π½ΠΈΡ 0 (ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°) ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ57-68 ΠΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±ΡΡΠ΅ΡΠΎΠ² Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π°. ΠΡΡΠ΅Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ , ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΠΊ ΠΈ Π² ΠΏΠΎΡΠΎΠΊΠ΅-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅, ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ, Π·Π°ΡΠΈΡΠ΅Π½Π½Π°Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ mutex, ΠΏΡΡΡΠ°.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Π ΡΠ°Π·Π΄Π΅Π»Π΅ 22.3 ΠΊΠ½ΠΈΠ³ΠΈ [24] ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ. Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ Π±ΡΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGIO, Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ» ΡΠΎΠ±ΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ (ΡΡΠ½ΠΊΡΠΈΡ dg_echo). Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡΠ» ΡΡΠ΅ΡΡΠΈΠΊ nqueue. ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π» ΡΠΈΠ³Π½Π°Π» SIGIO Π½Π° Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ°.
10.12. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΡΠΎΡΡΡ: ΡΠ°ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡ (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ° semt, Π°Π΄ΡΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ sem_init) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΡΡ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π° Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ sem_init Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ 1.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ ΠΊ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ: ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ° pthread_mutex_t, pthread_cond_t ΠΈΠ»ΠΈ pthread_rwlock_t) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ PTHREAD_PROCESS SHARED.
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΏΡΠΎΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈ ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, ΡΠΊΠ°Π·Π°Π² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ sem_open. Π₯ΠΎΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ sem_open ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½Ρ, Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°ΠΌΠΈ, Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈ ΡΠΎΠΌΡ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ.
Π§ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sem_open, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΈΠΏ sem_t, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ fork? Π ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ fork Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ Posix.1 Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ Β«Π²ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Π±ΡΠ΄ΡΡ ΠΎΡΠΊΡΡΡΡ ΠΈ Π² Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅Β». ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π²Π΅ΡΠ΅Π½: