34 return (1);
35 }
36 ssize_t
37 readline(int fd, void *vptr, size_t maxlen)
38 {
39 int n, rc;
40 char c, *ptr;
41 Rline *tsd;
42 Pthread_once(&rl_once, readline_once);
43 if ((tsd = pthread_getspecific(rl_key)) == NULL) {
44 tsd = Calloc(1, sizeof(Rline)); /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½ΡΠ»Π΅ΠΌ */
45 Pthread_setspecifiΡ(rl_key, tsd);
46 }
47 ptr = vptr;
48 for (n = 1; n < maxlen; n++) {
49 if ((rc = my_read(tsd, fd, &c)) == 1) {
50 *ptr++ = c;
51 if (c == '\n')
52 break;
53 } else if (rc == 0) {
54 *ptr = 0;
55 return (n-1); /* EOF, Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΡΡΠΈΡΠ°Π½Ρ */
56 } else
57 return (-1); /* ΠΎΡΠΈΠ±ΠΊΠ°, errno ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ read() */
58 }
59 *ptr = 0;
60 return (n);
61 }
Π€ΡΠ½ΠΊΡΠΈΡ my_read19-35 ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ Rline, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π° Π² ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°).
Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΏΠ°ΠΌΡΡΠΈ42 Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ pthread_once, ΡΠ°ΠΊ ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ readline Π² ΡΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, Π²ΡΠ·Π²Π°Π» Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ readline_once Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ»ΡΡΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°43-46 Π€ΡΠ½ΠΊΡΠΈΡ pthread_getspecific Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ Rline Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ readline Π΄Π°Π½Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ Rline, Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ rl_cnt ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½ΡΠ»Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ calloc. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΡΠΎΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_setspecific. ΠΠΎΠ³Π΄Π° ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ readline Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π·, ΡΡΠ½ΠΊΡΠΈΡ pthread_getspecific Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ ΡΡΠΎΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½.
26.6. ΠΠ΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ (ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅)
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Ρ Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° 16.5 ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ Π΅Π³ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ connect. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΠΊΠ΅ΡΡ Π² ΠΈΡ Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΈΠ΄Π΅ β Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΌΠΈ, ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ connect, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΄ΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΊ ΡΠ°Π±ΠΎΡΠ΅.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 26.7 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ Π½Π°ΡΠ°Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ main.
ΠΠΈΡΡΠΈΠ½Π³ 26.7. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ Π½Π°ΡΠ°Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ main
//threads/web01.c
1 #include "unpthread.h"
2 #include <thread.h> /* ΠΏΠΎΡΠΎΠΊΠΈ Solaris */
3 #define MAXFILES 20
4 #define SERV "80" /* Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΈΠ»ΠΈ ΠΈΠΌΡ ΡΠ»ΡΠΆΠ±Ρ */
5 struct file {
6 char *f_name; /* ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° */
7 char *f_host; /* ΠΈΠΌΡ ΡΠ·Π»Π° ΠΈΠ»ΠΈ IP-Π°Π΄ΡΠ΅Ρ */
8 int f_fd; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ */
9 int f_flags; /* F_xxx Π½ΠΈΠΆΠ΅ */
10 pthread_t f_tid; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° */
11 } file[MAXFILES];
12 #define F_CONNECTING 1 /* ΡΡΠ½ΠΊΡΠΈΡ connect () Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅
Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ */
13 #define F_READING 2 /* ΡΡΠ½ΠΊΡΠΈΡ connect() Π·Π°Π²Π΅ΡΡΠ΅Π½Π°;
Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ */
14 #define F_DONE 4 /* Π²ΡΠ΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ */
15 #define GET_CMD "GET %s HTTP/1.0\r\n\r\n"
16 int nconn, nfiles, nlefttoconn, nlefttoread;
17 void *do_get_read(void*);
18 void home_page(const char*, const char*);
19 void write_get_cmd(struct file*);
20 int
21 main(int argc, char **argv)
22 {
23 int i, n, maxnconn;
24 pthread_t tid;
25 struct file *fptr;
26 if (argc < 5)
27 err_quit("usage: web <#conns> <IPaddr> <homepage> file1 ...");
28 maxnconn = atoi(argv[1]);
29 nfiles = min(argc - 4, MAXFILES);
30 for (i = 0; i < nfiles; i++) {
31 file[i].f_name = argv[i + 4];
32 file[i].f_host = argv[2];
33 file[i].f_flags = 0;
34 }
35 printf("nfiles = %d\n", nfiles);
36 home_page(argv[2], argv[3]);
37 nlefttoread = nlefttoconn = nfiles;
38 nconn = 0;
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅1-16 ΠΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» <thread.h> Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ <pthread.h>, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Solaris Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Pthreads, ΠΊΠ°ΠΊ ΠΌΡ Π²ΡΠΊΠΎΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ.
10 ΠΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ ΡΡΡΡΠΊΡΡΡΠ΅ file ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° f_tid. ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΠΊΠΎΠ΄Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.9. Π ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ select, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½Π΅ Π½ΡΠΆΠ½Ρ Π½Π°Π±ΠΎΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ maxfd.
36 Π€ΡΠ½ΠΊΡΠΈΡ home_page Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈΡΡΠΈΠ½Π³Π° 16.10. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 26.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠΈΠΊΠ» ΠΏΠΎΡΠΎΠΊΠ° main.
ΠΠΈΡΡΠΈΠ½Π³ 26.8. ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠΈΠΊΠ» ΠΏΠΎΡΠΎΠΊΠ° main
//threads/web01.c
39 while (nlefttoread > 0) {
40 while (nconn < maxnconn && nlefttoconn > 0) {
41 /* Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ */
42 for (i = 0; i < nfiles; i++)
43 if (file[i].f_flags == 0)
44 break;
45 if (i == nfiles)
46 err_quit("nlefttoconn = %d but nothing found", nlefttoconn);
47 file[i].f_flags = F_CONNECTING;
48 Pthread_create(&tid, NULL, &do_get_read, &file[i]);
49 file[i].f_tid = tid;
50 nconn++;
51 nlefttoconn--;
52 }
53 if ((n = thr_join(0, &tid, (void**)&fptr)) != 0)
54 errno = n, err_sys("thr_join error");
55 nconn--;
56 nlefttoread--;
57 printf("thread id %d for %s done\n", tid, fptr->f_name);
58 }
59 exit(0);
60 }
ΠΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ40-52 ΠΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ (nconn ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ maxconn), ΠΌΡ ΡΠ°ΠΊ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ. Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, β ΡΡΠΎ do_get_read, Π° Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ file.
ΠΠ΄Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΠΎΠΊΠ°53-54 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² thr_join Solaris Ρ Π½ΡΠ»Π΅Π²ΡΠΌ ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π½Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π² Pthreads Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΡΠΏΠΎΡΠΎΠ±, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΆΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ pthread_join ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΌΡ ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°Π»ΠΈ, Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΡ ΠΆΠ΄Π΅ΠΌ. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 26.9 ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Pthreads ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π³Π»Π°Π²Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² thr_join Solaris, Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΌ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π·Π΄Π΅ΡΡ ΡΡΡ Π²Π΅ΡΡΠΈΡ Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΎΡΠ»ΠΎΠΆΠ½ΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (mutex). Π ΡΡΠ°ΡΡΡΡ, Π² Solaris Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΡΠΌΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Pthreads ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Solaris.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 26.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ do_get_read, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ TCP, ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ HTTP GET ΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 26.9. Π€ΡΠ½ΠΊΡΠΈΡ do_get_read
//threads/web01.c
61 void*
62 do_get_read(void *vptr)
63 {
64 int fd, n;
65 char line[MAXLINE];
66 struct file *fptr;
67 fptr = (struct file*)vptr;
68 fd = Tcp_connect(fptr->f_host, SERV);
69 fptr->f_fd = fd;
70 printf("do_get_read for %s, fd %d, thread %d\n",
71 fptr->f_name, fd, fptr->f_tid);
72 write_get_cmd(fptr);
73 /* Π§ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° */
74 for (;;) {
75 if ((n = Read(fd, line, MAXLINE)) == 0)
76 break; /* ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ */
77 printf ("read %d bytes from %s\n", n, fptr->f_name);
78 }
79 printf("end-of-file on %s\n\", fptr->f_name);
80 Close(fd);
81 fptr->f_flags = F_DONE; /* ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ F_READING */
82 return (fptr); /* Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° */
83 }
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° TCP, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ68-71 Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠΊΠ΅Ρ TCP, ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ tcp_connect ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ connect, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
ΠΡΠΏΡΠ°Π²ΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° ΡΠ΅ΡΠ²Π΅ΡΡ72 Π€ΡΠ½ΠΊΡΠΈΡ write_get_cmd ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ HTTP GET ΠΈ ΠΎΡΡΡΠ»Π°Π΅Ρ Π΅Π΅ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΡ Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π½ΠΎΠ²ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ΠΌ ΠΎΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 16.12 ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π² Π²Π΅ΡΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠΎΠΊΠΈ, Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡ FD_SET ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ maxfd.