на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить




Листинг 6.19. Функция server

//svmsgmpxnq/server.c

1  #include "mesg.h"


2  void

3  server(int readid, int writeid)

4  {

5   FILE *fp;

6   char *ptr;

7   ssize_t n;

8   struct mymesg mesg;

9   void sig_chld(int);

10  Signal(SIGCHLD, sig_chld);

11  for (;;) {

12   /* считывание имени файла из очереди */

13   mesg.mesg_type = 1;

14   if ((n = Mesg_recv(readid, &mesg)) == 0) {

15    err_msg("pathname missing");

16    continue;

17   }

18   mesg.mesg_data[n] = 40'; /* имя файла */

19   if ((ptr = strchr(mesg.mesg_data, ' ')) = NULL) {

20    err_msg("bogus request: %s", mesg.mesg_data);

21    continue;

22   }

23   *ptr++ = 0; /* ptr = имя файла */

24   writeid = atoi(mesg.mesg_data);

25   if (Fork() == 0) { /* дочерний процесс */

26    if ((fp = fopen(ptr, "r")) == NULL) {

27     /* ошибка: нужно сообщить клиенту */

28     snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) – n,

29      ": can't open, %s\n", strerror(errno));

30     mesg.mesg_len = strlen(ptr);

31     memmove(mesg.mesg_data, ptr, mesg.mesg_len);

32     Mesg_send(writeid, &mesg);

33    } else {

34     /* файл открыт, копируем клиенту */

35     while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {

36      mesg.mesg_len = strlen(mesg.mesg_data);

37      Mesg_send(writeid, &mesg);

38     }

39     Fclose(fp);

40    }

41    /* отправка сообщения нулевой длины, указывающего конец файла */

42    mesg.mesg_len = 0;

43    Mesg_send(writeid, &mesg);

44    exit(0); /* завершение дочернего процесса */

45   }

46   /* родительский процесс просто зациклен */

47  }

48 }


Листинг 6.18. Обработчик сигнала SIGCHLD, вызывающий waitpid | UNIX: взаимодействие процессов | Листинг 6.20. Функция-обертка Mesg_recv, обрабатывающая прерванный системный вызов