Форум программистов, компьютерный форум, киберфорум
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
1

Очереди сообщений в Linux ubuntu

03.12.2013, 00:41. Просмотров 1554. Ответов 2
Метки нет (Все метки)

Здравствуйте, есть две програмулины. Программа client читает данные (числа) из файла и посылает их как сообщение программе server. Программа server читает данные из сообщения, суммирует их и записывает результат в файл.

Файл server.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"                            //описание структуры со-общения
 
#define PERM 0666                               //права доступа к со-общению
 
FILE *fd;                                    //дескриптор файла ре-зультатов
Message m;                                            //структура со-общения
key_t key;                                                 //ключ со-общения
float sum;                                                    //сумма чисел
int msgid;                                        //идентификатор со-общения
int n;                                         //количесво прочитанных байт
 
int main(void)
{
  printf("\n\t.:SERVER:.\n");
  m.mtype=1L;                                    //определяем тип со-общения
  if ((key=ftok("server",'A'))<0)                 //получаем ключ сообщения
  {perror("\n\tError (server - ftok)\n");return 0;}
  printf("\n\tGet a key\n");
  if((msgid=msgget(key,PERM|IPC_CREAT))<0)  //получаем дескриптор сообщения
  {perror("\n\tError (server - msgget)\n");return 0;}
  printf("\tCreate a message\n");
  if ((fd=fopen("result.txt","w+"))==NULL)       //создаём файл результатов
  {perror("\n\tError (server - fopen)\n");return 0;}
  printf("\tOpen(Create) result file\n");
  while ((n=msgrcv(msgid,&m,sizeof(m),m.mtype,0))>0)   //получаем сообщение
  {
sum=m.cord[0]+m.cord[1]+m.cord[2]+m.cord[3]+m.cord[4]+m.cord[5];//суммируем
    printf("\tSum=%f\n",sum);                //выводим сумму чисел на экран
    if ((fprintf(fd,"Sum=%f \n",sum))<=0)          //и записываем её в файл
    {perror("\n\tError (server - fprintf)\n");return 0;}
    printf("\tResult has writen to file\n"); 
  }
  close(fd);                       //закрываем дескриптор файла ре-зультатов
  return 0;
}

Файл client.c

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"                            //описание структуры со-общения
FILE *fd;                                         //дескриптор файла данных
Message m;                                            //структура со-общения
key_t key;                                                 //ключ со-общения
int msgid;                                        //идентификатор со-общения
 
int main(void)
{
  printf("\n\t.:CLIENT:.\n");
  m.mtype=1L;                                    //определяем тип со-общения
  if ((key=ftok("server",'A'))<0)                 //получаем ключ сооющения
  {perror("\n\tError (client - ftok)\n");return 0;}
  printf("\n\tGet a key\n");
  if((msgid=msgget(key,0))<0)               //получаем дескриптор со-общения
  {perror("\n\tError (client - msgget)\n");return 0;}
  printf("\tGet access to messages\n");
  if ((fd=fopen("data.txt","r+"))==NULL) //открываем файл данных для чтения
  {perror("\n\tError (client - fopen)\n");return 0;}
  printf("\tOpen data file\n");
  while ((fscanf(fd,"%f %f %f %f %f %f ",&m.cord[0],&m.cord[1],
  &m.cord[2],&m.cord[3],&m.cord[4],&m.cord[5]))!=EOF)
  {                                               //читаем из файла 6 чисел
    printf("\n\tContent of data file:\n");            //выводим их на экран
    printf("\n\t%f %f %f %f %f %f\n",m.cord[0],m.cord[1],
           m.cord[2],m.cord[3],m.cord[4],m.cord[5]);
    if ((msgsnd(msgid,(void*)&m,sizeof(m.cord),0))!=0) //посылаем сообщение
    {perror("\n\tError (client - msgsnd)\n");return 0;}
    printf("\tMessage is sent\n");
  }
  if(msgctl(msgid,IPC_RMID,0)<0)             //удаляем дескриптор сообщения
  {perror("\n\tError (client - msgctl\n");return 0;}
  printf("\tMessage ID has deleted\n");
  close(fd);                            //закрываем дескриптор файла данных
  return 0;
}
Файл mesg.h

C
1
2
3
4
5
6
//файл содержит объявление структуры сообщения
typedef struct our_msgbuf                                   //имя структуры
{
  long mtype;                                               //тип со-общения
  float cord[6];                       //массив из шести вещественных чисел
}Message;                                                   //тип структуры
Вопрос заключается в следующем, как программе client считать данные состоящие из массива, передать сообщением программе server. Server поминает местами min, max числа массива и вернет отсортированный массив программе client.
Помогите пожалуйста, очень нужно. Очень очень.
Заранее огромное спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2013, 00:41
Ответы с готовыми решениями:

Очереди сообщение (создание очереди из N сообщений)
Нужна помощь в создании очереди из n сообщений как создать простую очередь я знаю но как указать...

Нужен компилятор под linux mint или linux ubuntu
Нужен компилятор под linux mint или linux ubuntu. Желательно голенький компилятор без редактора, и,...

Ubuntu Linux или Альт Linux 5.0 Школьный?
Здравствуйте! Не могли бы вы подсказать какой Linux лучше? Ubuntu Linux или Альт Linux 5.0...

Linux Simply(ALT Linux Lite) + Ubuntu 9.10
Собственно, дело в чем. Пытался ставить Linux Simply вместе с уже установленной убунту -...

2
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
08.12.2013, 19:17  [ТС] 2
Помогите плиз, очень срочно надо!!!
Есть кусок проги, алгоритм перестановки местами элементов массива, не знаю как его туда запихнуть.
Тем более там чтение из файла.
вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <unistd.h>
 
int find_min(int *array, int count)
{
  if (count < 1) return -1;
  int i, imin= 0, min= array[0];
  for (i= 0; i < count; i++) if (array[i] < min) {
      min= array[i]; imin= i;
  }
  return imin;
}
 
int find_max(int *array, int count)
{
  if (count < 1) return -1;
  int i, imax= 0, max= array[0];
  for (i= 0; i < count; i++) if (array[i] > max) {
      max= array[i]; imax= i;
  }
  return imax;
}
 
main() {
  int m[4][5]= {77,2,3,4,5,  20,30,40,50,60,  18,16,14,12,10,  6,7,80,9,10};
  pid_t pid= fork();
  if (pid == -1) return -1;
  if (pid) {
    int imin= find_min (m[0], 20);
    printf ("min: [%d,%d]= %d\n", imin / 5, imin % 5, m[imin / 5][imin % 5]);
    if (wait(0) == -1) return -1;
  }
  else {
    int imax= find_max (m[0], 20);
    printf ("max: [%d,%d]= %d\n", imax /  5, imax % 5, m[imax / 5][imax % 5]);
  }
  return 0;
}
Подскажите хоть что-то.
0
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
11.12.2013, 21:38  [ТС] 3
Все лабу доделал, тема закрыта. Всем спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2013, 21:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Очереди сообщений
Доброго всем дня!подскажите пожалуйста и помогите с написанием с неочень большой и сложной...

Статистика из очереди сообщений
Ребят, выручайте. Я SQL вообще не знаю, а задание надо сделать, дедлайн скоро. Сижу, читаю, но...

Разработка Собственной Очереди Сообщений
Всем привет. Вот возник очередной философский вопрос. Есть офис с небольшим почтовым трафиком...

Клиенты и сервера. Очереди сообщений.
Задача на С: Существуют два клиента и 1 сервер Клиенты читают строки из файла, причём: клиент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.