Как вы видели в
1. Прежде всего, директивы #include
#include "cd_data.h"
#include "cliserv.h"
2. Вы также определяете в файле программы несколько значений, нужных вам в разных функциях:
static int server_fd = -1;
static pid_t mypid = 0;
static char client_pipe_name[PATH_MAX + 1] = {'\0'};
static int client_fd = -1;
static int client_write_fd = -1;
Далее нужно рассмотреть функции серверной стороны. В следующем разделе показаны функции, открывающие и закрывающие именованный канал и читающие сообщения от клиентов. В следующем за ним разделе приведен программный код, который открывает и закрывает клиентские каналы и пересылает по ним сообщения, основываясь на идентификаторе процесса, который клиент включает в свое сообщение.
1. Подпрограмма server_starting
open будет блокировать выполнение, пока клиент не откроет канал для записи. Используйте режим блокировки для того, чтобы сервер мог выполнить блокировку вызовов read в канале в ожидании отправляемых ему команд.int server_starting(void) {
#if DEBUG_TRACE
printf("%d server_starting\n", getpid);
#endif
unlink(SERVER_PIPE);
if (mkfifo(SERVER_PIPE, 0777) == -1) {
fprintf(stderr, "Server startup error, no FIFO created\n");
return(0);
}
if ((server_fd = open(SERVER_PIPE, O_RDONLY)) == -1) {
if (errno == EINTR) return(0);
fprintf(stderr, "Server startup error, no FIFO opened\n");
return(0);
}
return(1);
}
2. Когда сервер завершает работу, он удаляет именованный канал, для того чтобы клиенты могли установить, что нет действующего сервера.
void server_ending(void) {
#if DEBUG_TRACE
printf("%d:- server_ending\n", getpid);
#endif
(void)close(server_fd);
(void)unlink(SERVER_PIPE);
}
3. Функция read_request_from_client
int read_request_from_client(message_db_t *rec_ptr) {
int return_code = 0;
int read_bytes;
#if DEBUG_TRACE
printf("%d :- read_request_from_client\n", getpid);
#endif
if (server_fd != -1) {
read_bytes = read(server_fd, rec_ptr, sizeof(*rec_ptr));
...
}
return(return_code);
}
4. В особом случае, когда ни у одного клиента нет канала, открытого для записи, вызов read
if (read_bytes == 0) {
(void)close(server_fd);
if ((server_fd = open(SERVER_PIPE, O_RDONLY)) == -1) {
if (errno != EINTR) {
fprintf(stderr, "Server error, FIFO open failed\n");
}
return(0);
}
read_bytes = read(server_fd, rec_ptr, sizeof(*rec_ptr));
}
if (read_bytes == sizeof(*rec_ptr)) return_code = 1;