voltage

fifo_server

Jun 14th, 2013
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>
  9. #include <errno.h>
  10.  
  11. #include "proto.h" /* http://pastebin.com/EMfpHdZC */
  12.  
  13. int main(int argc, char** argv)
  14. {
  15.     int fdfifo, fdoutfifo;
  16.     char buf[RESULT_FIFO_PATH_BUF_SIZE];
  17.     query_t query;
  18.     result_t result;
  19.  
  20.     if(mkfifo(QUERY_FIFO_PATH, S_IRUSR | S_IWUSR) < 0 && errno != EEXIST) /* попытка найти или создать канал сервера */
  21.     {
  22.         perror("mkfifo");
  23.         abort();
  24.     }
  25.  
  26.     while(1) /* выполняем обработку всех запросов, блокируемся на open() или read() */
  27.     {
  28.         if((fdfifo = open(QUERY_FIFO_PATH, O_RDONLY)) < 0) /* попытка открыть канал */
  29.         {
  30.             perror("open");
  31.             abort();
  32.         }
  33.  
  34.         while(read(fdfifo, &query, sizeof(query))) /* цикл по запросам в канале */
  35.         {
  36.             result.rs = query.m1 * query.m2; /* вычисляем произведение чисел из запроса */
  37.  
  38.             sprintf(buf, RESULT_FIFO_PATH_FMT, query.pid); /* конструируем путь к каналу ответов */      
  39.  
  40.             if((fdoutfifo = open(buf, O_WRONLY)) < 0) /* попытка открыть канал ответа */
  41.             {
  42.                 perror("open");
  43.                 abort();
  44.             }
  45.        
  46.             write(fdoutfifo, &result, sizeof(result)); /* запись ответа в канал */
  47.  
  48.             close(fdoutfifo); /* ФД канала ответа больше не нужен, закрываем */
  49.  
  50.             printf("%ld -> [%s]\n", result.rs, buf); /* вывод диагностической информации */
  51.         }
  52.  
  53.         close(fdfifo); /* ФД канала сервера больше не нужен */
  54.     }
  55.    
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment