31: sigemptyset(&mask);
32: sigaddset(&mask, SIGRTMIN);
33:
34: sigprocmask(SIG_BLOCK, &mask, &oldMask);
35:
36: /* Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π»Ρ */
37: val.sival_int = 1;
38: sigqueue(me, SIGRTMIN, val);
39: val.sival_int++;
40: sigqueue(me, SIGRTMIN, val);
41: val.sival_int++;
42: sigqueue(me, SIGRTMIN, val);
43:
44: /* Π Π°Π·ΡΠ΅ΡΠΈΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² */
45: sigprocmask(SIG_SETMASK, &oldMask, NULL);
46:
47: return 0;
48: }
ΠΠ»Π°Π²Π° 13
Π Π°ΡΡΠΈΡΠ΅Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²
Π Linux ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π·Π°Π΄Π°Ρ, ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΡΡΡΠΎΠΉΡΡΠ². Π Π°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. Π Π³Π»Π°Π²Π΅ 11 ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ; Π² Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ ΠΆΠ΅ Π³Π»Π°Π²Π΅ ΠΈΡΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ², ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π²ΡΠ°Π·Π±ΡΠΎΡ.
13.1. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΡΡ ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΠ½ΠΎΠ³ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Web-Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π²ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Web-ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ Π½Π° Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ Web-ΡΡΡΠ°Π½ΠΈΡ, Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. ΠΡΠΎΠΌΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ (IPC), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ X-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ, Π±ΡΠ°ΡΠ·Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ².
ΠΡΠ°ΡΠ·Π΅ΡΡ Π»Π΅Π³ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΈ ΡΠ°ΠΉΠ»Ρ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π½ΠΈΡ (ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² read() Π² ΡΠ΅ΡΠ΅Π²ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ, ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°Π½Π°Π»Π΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ). ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ.
ΠΡΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ΅ΡΠ΅Π²ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ, Π½Π°ΡΠΈΠ½Π°ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΎΠ³Π΄Π° Π±ΡΠ°ΡΠ·Π΅Ρ ΡΠ½ΠΎΠ²Π° ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ read() Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ . ΠΠ΅ ΡΡΠΎΠΈΡ ΠΈ ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΄ΠΎΠ±ΠΎΠ²Π°ΡΠΈΠΌΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ°.
ΠΠ»Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΡΠΎΡΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², p1 ΠΈ p2. ΠΠ»Ρ Π΅Π΅ ΠΈΡΠΏΡΡΠ°Π½ΠΈΡ ΠΎΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΠΈ ΡΠ΅Π°Π½ΡΠ° ΡΠ°Π±ΠΎΡΡ Ρ X-ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΠΌ (ΠΈΠ»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΡΠ΅ΠΌΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠΌΠΈ). Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ p1 ΠΈ p2 (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ mknod), Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ cat > p1 ΠΈ cat > p2 Π² Π΄Π²ΡΡ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°Ρ , ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡΡΡΠΈΠ² mpx-blocks Π² ΡΡΠ΅ΡΡΠ΅ΠΌ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΈΡΠ°ΠΉΡΠ΅ Π»ΡΠ±ΠΎΠΉ ΡΠ΅ΠΊΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠΊΠ½ΠΎ cat ΠΈ ΡΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ cat Π½Π΅ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΊΠ°Π½Π°Π»Ρ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ.
1: /* mpx-blocks.Ρ */
2:
3: #include <fcntl.h>
4: #include <stdio.h>
5: #include <unistd.h>
6:
7: int main(void) {
8: int fds[2];
9: char buf[4096];
10: int i;
11: int fd;
12:
13: if ((fds[0] = open("p1", O_RDONLY) ) < 0) {
14: perror("open p1");
15: return 1;
16: }
17:
18: if ( (fds[1] = open("p2", O_RDONLY)) < 0) {
19: perror("open p2");
20: return 1;
21: }
22:
23: fd = 0;
24: while (1) {
25: /* Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ, ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΈΡ */
26: i = read (fds[fd], buf, sizeof (buf) - 1);
27: if (i < 0) {
28: perror("read");
29: return 1;
30: } else if (!i) {
31: printf("ΠΊΠ°Π½Π°Π» Π·Π°ΠΊΡΡΡ\n");
32: return 0;
33: }
34:
35: buf[i] = '\0';
36: printf ("ΡΡΠ΅Π½ΠΈΠ΅: %s", buf);
37:
38: /* ΡΠΈΡΠ°ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° */
39: fd = (fd + 1) % 2;
40: }
41: }
Π₯ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mpx-blocks ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ ΠΊΠ°Π½Π°Π»ΠΎΠ², ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΎΠ±ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ. ΠΠ½Π° ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΈΡΠ°Π΅Ρ ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΏΠΎΠΊΠ° Π² Π½Π΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π°Π½Π½ΡΠ΅, Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΠΉΠ» ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ· read() Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» Π²ΠΎΠ·Π²ΡΠ°Ρ, ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°ΠΉΠ» ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π³Π»Π°Π΄ΠΊΠΎΠ΅ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ . ΠΠ° ΡΠΈΡ. 13.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mpx-blocks Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π ΠΈΡ. 13.1. ΠΡΠΈΠΌΠ΅ΡΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ
13.1.1. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄
ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π² Π³Π»Π°Π²Π΅ 11, Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° fcntl. ΠΡΠ»ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ, read() ΡΡΠ°Π·Ρ ΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ. ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ, ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ Π²Π²ΠΎΠ΄- Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
ΠΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ mpx-blocks ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ Π³Π»Π°Π΄ΠΊΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ p1 ΠΈ p2.
1: /* mpx-nonblock.c */
2:
3: #include <errno.h>
4: #include <fcntl.h>
5: #include <stdio.h>
6: #include <unistd.h>
7:
8: int main(void) {
9: int fds[2];
10: char buf[4096];
11: int i;
12: int fd;
13:
14: /* ΠΎΡΠΊΡΡΡΡ ΠΎΠ±Π° ΠΊΠ°Π½Π°Π»Π° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ */
15: if ((fds[0] = open("p1", O_RDONLY | O_NONBLOCK)) < 0) {
16: perror("open p1");
17: return 1;
18: }
19:
20: if ((fds[1] = open("p2", O_RDONLY | O_NONBLOCK)) < 0) {
21: perror("open p2");
22: return 1;
23: }
24:
25: fd = 0;
26: while (1) {
27: /* Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ, ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΈΡ */
28: i = read(fds[fd], buf, sizeof (buf) - 1);
29: if ((i < 0) && (errno ! = EAGAIN)) {
30: perror("read");
31: return 1;
32: } else if (i > 0) {
33: buf[i] = '\0';
34: printf("ΡΡΠ΅Π½ΠΈΠ΅: %s", buf);
35: }
36:
37: /* ΡΠΈΡΠ°ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° */
38: fd = (fd + 1) % 2;
39: }
40: }
ΠΠ°ΠΆΠ½ΠΎΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ mpx-nonblock ΠΈ mpx-blocks ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mpx-nonblock Π½Π΅ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ½Π° ΡΡΠΈΡΡΠ²Π°Π΅Ρ, Π·Π°ΠΊΡΡΡ. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ read() ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Π±Π΅Π· Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0 Π±Π°ΠΉΡ, ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Ρ ΡΠ°ΠΊΠΎΠ²ΡΠΌΠΈ, Π½ΠΎ Π±Π΅Π· Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π΄Π°Π½Π½ΡΡ read() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ EAGAIN.
ΠΡΠΎΡΡΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄ΠΎΡΡΠ°Π΅ΡΡΡ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠ΅Π½ΠΎΠΉ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ΅Π³Π΄Π° ΠΎΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° β ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ. ΠΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΠ½ΠΎΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΠ°ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ 10 ΠΊΠΎΠΏΠΈΠΉ mpx-nonblock Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π° Π΅Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ).
13.1.2. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ poll()
ΠΠ»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Linux ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² poll(), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ². ΠΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ, ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΈΡΠ°ΡΡ, Π° Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ β Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ. ΠΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅ΡΡ Π΄Π°Π½Π½ΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΈΠ»ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠ΅ Π² Π½ΠΈΡ , poll() Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°Ρ , Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΡΡΡ ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅. ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² poll(), Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ Π΄ΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΡΠ°ΠΉΠ»Π°. ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ poll().
#include <sys/poll.h>
int poll(struct pollfd * fds, int numfds, int timeout);
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡ; numfds Π·Π°Π΄Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, a timeout ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠ»Π³ΠΎ poll() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠΆΠΈΠ΄Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ. ΠΡΠ»ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° Π·Π°Π΄Π°Π΅ΡΡΡ 0, poll() Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ°.