Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 195

Автор Уильям БтивСнс

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_read

19-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.