8. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.3 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΈΡΡΠΈΠ½Π³ Π.Π. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΈ fstat ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² ΠΊΠ°Π½Π°Π»Π΅ FIFO?//pipe/test1l.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd[2],
6 char buff[7];
7 struct stat info;
8 if (argc != 2)
9 err_quit("usage: test1 <pathname>");
10 Mkfifo(argv[1], FILE_MODE);
11 fd[0] = Open(argv[1], O_RDONLY | O_NONBLOCK);
12 fd[1] = Open(argv[1], O_WRONLY | O_NONBLOCK);
13 /* 4check sizes when FIFO is empty */
14 Fstat(fd[0], &info);
15 printf("fd[0]: st_size = %ld\n", (long) info.st_size);
16 Fstat(fd[1], &info);
17 printf("fd[1]: st_size = %ld\n", (long) info.st_size);
18 Write(fd[1], buff, sizeof(buff));
19 Fstat(fd[0], &info);
20 printf("fd[0]: st_size = %ld\n", (long) info.st_size);
21 Fstat(fd[1], &info);
22 printf("fd[1]: st_size = %ld\n", (long) info.st_size);
23 exit(0);
24 }
9. ΠΡΠ·ΠΎΠ² select Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π½ΠΎ Π²ΡΠ·ΠΎΠ² write ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π° SIGPIPE. ΠΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΠΊΠ½ΠΈΠ³Π΅ [24, Ρ. 153-155]; ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ, select Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½, Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠΆΠ΅ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ read ΠΈΠ»ΠΈ write. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.4 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏpoΠ³ΡaΠΌΠΌΡ.
ΠΠΈΡΡΠΈΠ½Π³ Π.4. Π§ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ select ΠΏΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΊΠ°Π½Π°Π»Π°?//pipe/test2.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd[2], n;
6 pid_t childpid;
7 fd_set wset;
8 Pipe(fd);
9 if ((childpid = Fork()) == 0) { /* child */
10 printf("child closing pipe read descriptor\n");
11 Close(fd[0]);
12 sleep(6);
13 exit(0);
14 }
15 /* 4parent */
16 Close(fd[0]); /* Π΄Π»Ρ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΊΠ°Π½Π°Π»Π° */
17 sleep(3);
18 FD_ZERO(&wset);
19 FD_SET(fd[1], &wset);
20 n = select(fd[1] + 1, NULL, &wset, NULL, NULL);
21 printf("select returned %d\n", n);
22 if (FD_ISSET(fd[1], &wset)) {
23 printf("fd[1] writable\n");
24 Write(fd[1], "hello", 5);
25 }
26 exit(0);
27 }
ΠΠ»Π°Π²Π° 5
1. Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ mq_getattr Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°ΡΠ΅ΠΌ ΡΠ΄Π°Π»ΠΈΡΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΅Π΅ ΡΠ½ΠΎΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Π½Π΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
2. ΠΠ»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π» Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°.
3. ΠΠ»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π» Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ Π±ΡΠ»Π° ΠΏΡΡΡΠ°.
4. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ GNU Π‘ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Solaris 2.6 (Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ²Ρ sysconf) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ:
test1.c:13: warning: int format, long int arg (arg 2)
test1.c:13: warning: int format, long int arg (arg 3)
5. Π Solaris 2.6 ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ 1000000 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ 10 Π±Π°ΠΉΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΉΠ» ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 20000536 Π±Π°ΠΉΡ, ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏpoΠ³ΡaΠΌΠΌΡ 5.4: 10 Π±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, 8 Π±Π°ΠΉΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ), Π΅ΡΠ΅ 2 Π±Π°ΠΉΡΠ° Π΄ΠΎΠ±Π°Π²ΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ 4) ΠΈ 536 Π±Π°ΠΉΡ Π΄ΠΎΠ±Π°Π²ΠΎΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π° Π²Π΅ΡΡ ΡΠ°ΠΉΠ». ΠΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ mq_open ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠΉ ps, ΡΠ°Π²Π½ΡΠ»ΡΡ 1052 ΠΠ±Π°ΠΉΡ, Π° ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΡΡΠΎΡ Π΄ΠΎ 20 ΠΠ±Π°ΠΉΡ. ΠΡΠΎ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ, ΠΈ mq_open ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ°ΠΉΠ» Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡΡΡ Π² Digital Unix 4.0B.
6. Π Π°Π·ΠΌΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, ΡΠ°Π²Π½ΡΠΉ Π½ΡΠ»Ρ, Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ANSI Π‘ memXXX. Π ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ° 1989 Π³ΠΎΠ΄Π° Π₯3.159-1989 (ISO/IEC 9899:1990) Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ (ΠΊΠ°ΠΊ ΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ), Π½ΠΎ Π² Technical Corrigendum Number 1 ΡΠ²Π½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° 0 Π½Π΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ (Π½ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌΠΈ). ΠΠΎΠΎΠ±ΡΠ΅, Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΠ·ΡΠΊΡ Π‘ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://www.lysator.liu.se/c/.
7. ΠΠ»Ρ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ (ΡΠΌ. Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΠΈΡΡΠΈΠ½Π³ Π.15). ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π»ΠΈΡΡΠΈΠ½Π³ 4.4 Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΌΡ Π±Ρ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ ΡΠ°ΠΌ ΠΆΠ΅ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΠ».
8. ΠΠ·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΠ»ΠΎΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ», ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΎΡΠΊΡΡΠ²Π°ΡΡΠΈΠΌΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΠ΅ΡΠ΅Π΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΠ° ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΠ»ΠΎΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡΡΡ.
9. ΠΠ°ΡΡΠΈΠ²Ρ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π½Π°ΠΊΠ° ΡΠ°Π²Π΅Π½ΡΡΠ²Π° Π² ΡΠ·ΡΠΊΠ΅ Π‘, Π° Π²ΠΎΡ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ.
10. Π€ΡΠ½ΠΊΡΠΈΡ main ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π²ΡΠ·ΠΎΠ²Π΅ select, ΠΎΠΆΠΈΠ΄Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ° ΠΊΠ°Π½Π°Π»Π°. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π° Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠ΅ΡΡΠ²Π°Π΅Ρ Π²ΡΠ·ΠΎΠ² select, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ EINTR. Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±Π΅ΡΡΠΊΠ° Select ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ select, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.5. Π ΠΊΠ½ΠΈΠ³Π΅ [24, Ρ. 124] Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΡΠ°ΡΡΠΊΠ°Π· ΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
ΠΠΈΡΡΠΈΠ½Π³ Π.5. ΠΠ±Π΅ΡΡΠΊΠ° Select, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°Ρ EINTR//lib/wrapunix.c
313 int
314 Select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
315 struct timeval *timeout)
316 {
317 int n;
318 again:
319 if ( (n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0) {
320 if (errno == EINTR)
321 goto again;
322 else
323 err_sys("select error");
324 } else if (n == 0 && timeout == NULL)
325 err_quit("select returned 0 with no timeout");
326 return(n); /* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ 0 ΠΏΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ */
327 }
ΠΠ»Π°Π²Π° 6
1. ΠΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π² ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ (Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ). ΠΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΠΏΡΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ, ΡΠΎΡΡΠΎΡΡΠ΅Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΈΡ ΡΠΈΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ°ΠΉΠ»Π°, Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ ftok, ΡΠ²Π»ΡΡΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΌΠΈ, ΠΎΠ½ΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» (ΡΠ»ΡΡ), ΠΈ ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ.
2. ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΡΠΈΠΏΠΎΠΌ 0 Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π°, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ 1, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΡ init.
3. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π° ΡΠΈΡ. 6.2 Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠ³ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° Π²ΡΠ΅ ΠΏΡΠΎΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ-ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΡΠ»ΠΈ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅ΡΡΡ ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ (ΡΠΈΡ. 6.3), Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΏΠΎΡΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²ΠΎΡ.
ΠΠ»Π°Π²Π° 7
2. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΡΡΠΏΠ΅Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ·ΠΎΠ² exit Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ Π²ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠ΅ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ.
3. Π Solaris 2.6 ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΈΠΏΠ° destroy ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΡΠ΅ΡΠΊΠ΅ ΠΏΠ°ΠΌΡΡΠΈ, ΠΈΠ· ΡΠ΅Π³ΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ init ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ. Π Digital Unix 4.0B ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠ°Π·Π½ΠΈΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ destroy Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½ΡΠΆΠ½ΠΎ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Digital Unix 4.0B ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ° attr_t ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π°ΡΡΠΈΠ±ΡΡΡ, Π° Π² Solaris 2.6 ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠ»Π°Π²Π° 9
1. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΡΠ΅ΡΡΠΈΠΊ Π΄ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π±ΠΎΠ»ΡΡΠΈΡ 20, ΡΡΠΎΠ±Ρ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
2. ΠΠ»Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ
setvbuf(stdout, NULL, _IONBF, 0);
ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΠΊΠ»ΠΎΠΌ for. ΠΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½ΠΈ Π½Π° ΡΡΠΎ Π²Π»ΠΈΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ·ΠΎΠ² printf ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΡΡΠΎΠΊΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°. ΠΠ±ΡΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π° Π±ΡΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² printf ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² write.
3. ΠΠ°ΠΌΠ΅Π½ΠΈΠΌ printf Π½Π°
snprintf(line, sizeof(line), "%s: pid = 3.1d, seq# = %d\n", argv[0], (long) pid, seqno);
for (ptr = line; (c = *ptr++) != 0) putchar(c);
ΠΈ ΠΎΠ±ΡΡΠ²ΠΈΠΌ Ρ ΠΊΠ°ΠΊ ΡΠ΅Π»ΠΎΠ΅, a ptr β ΠΊΠ°ΠΊ char*. ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΠ·Π²Π°Π»ΠΈ setvbuf Π΄Π»Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠ²ΠΎΠ΄Π°, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°. ΠΠ° ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎ Π΄Π°Π΅Ρ ΡΠ΄ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. Π’Π°ΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π°Π²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ.
4. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡΡ ΡΠ°ΠΉΠ»Π°, Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
5. ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ»Π°Π³ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ fcntl. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ fcntl ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: F_SETLKW (ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π°) ΠΈΠ»ΠΈ F_SETLK (ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π½ΠΈΠΊΠΎΠ³Π΄Π°).