Листинг 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 }