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

Именованный не именованный каналы

12.12.2013, 00:24. Показов 2847. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть програмулина, как её через каналы пустить??

клиенская часть

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
41
#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,"%d %d %d %d %d %d ",&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%d %d %d %d %d %d\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;
}
серверная часть

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"                            //описание структуры со-общения
 
#define PERM 0666                               //права доступа к со-общению
 
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;
}
 
int main(void)
{
  FILE *fd;                                    //дескриптор файла ре-зультатов
  Message m;                                            //структура со-общения
  key_t key;                                                 //ключ со-общения
  float sum;                                                    //сумма чисел
  int msgid;                                        //идентификатор со-общения
  int n;                                         //количесво прочитанных байт
  int minId, maxId, value;
 
  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)   //получаем 
  {
    minId = find_min(m.cord, 6);
    maxId = find_max(m.cord, 6);
    printf("Source array: %d %d %d %d %d %d \n", m.cord[0], m.cord[1], m.cord[2], m.cord[3], m.cord[4], m.cord[5]);
    value = m.cord[minId];
    m.cord[minId] = m.cord[maxId];
    m.cord[maxId] = value;
    printf("Result array: %d %d %d %d %d %d", m.cord[0], m.cord[1], m.cord[2], m.cord[3], m.cord[4], m.cord[5]);
    printf("\t \n");
  }
  close(fd);                       //закрываем дескриптор файла ре-зультатов
  return 0;
}
Структура сообщения
C
1
2
3
4
5
6
//файл содержит объявление структуры сообщения
typedef struct our_msgbuf                                   //имя структуры
{
  long mtype;                                               //тип со-общения
  int cord[6];                       //массив из шести вещественных чисел
}Message;                                                   //тип структуры
Можно сделать любым способ, любым типом канала как именованным так и не именованным. Буду очень благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.12.2013, 00:24
Ответы с готовыми решениями:

Именованный каналы (FIFO)
Здравствуйте, хотел бы спросить у знатоков, нет ли готовой библиотеки для работы с именованными пайпами (named pipe or FIFO). Честно говоря...

Именованный диапазон
Как кодом увеличить именованный диапазон на одну строку ?

Именованный конструктор + inline
Приветствую, Форумчане! Следующий код, оформленный в одном файле работает на ура. class Point2 { public: static Point2...

8
4 / 4 / 7
Регистрация: 18.11.2013
Сообщений: 53
12.12.2013, 10:40
Я бы реализовывал или через шаред меморе(shmem) или через Unix socket, или тебе надо именно через каналы?
0
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
12.12.2013, 22:17  [ТС]
да нужно именно через канал (Pipe)

Добавлено через 33 секунды
gyplex, по другому никак

Добавлено через 1 час 58 минут
Кто каналы знает?? помогите плиз!
0
Pioneer92
12.12.2013, 22:32
Требуется модератор на форум. Посменно. Обязанности - удалять сообщения, которые нарушают правила форума. Гибкий график - 3-4 часа в сутки. Оплата 7000 руб. в неделю. Пишите на email: workadmtext@gmail.com
 Аватар для Dizark
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 84
12.12.2013, 22:32
Через неименованные каналы два неродственных процесса пускать - дело сложное и неблагодарное.

А через именованные - это почти тоже самое, что и работа через вспомогательный файл.

одна программа создает дескриптор fifo
C
1
mkfifo ("filename", 0600);                        // 0600 - это права доступа
ну а далее
C
1
fd = fopen ("filename", "rw");
и как с обычным файлом

Также на тему каналов (и вообще межпроцессного взаимодействия) вот хорошая, годная статья:
http://symmetrica.net/uploads/linapi/linapi2.pdf
1
4 / 4 / 7
Регистрация: 18.11.2013
Сообщений: 53
12.12.2013, 23:41
Цитата Сообщение от MrWoolf Посмотреть сообщение
да нужно именно через канал (Pipe)

Добавлено через 33 секунды
gyplex, по другому никак

Добавлено через 1 час 58 минут
Кто каналы знает?? помогите плиз!
pipe это неименнованый канал, он реализовываеться с помощью вилки(fork)! у тебя клиент-сервер, тут уже тебе надо через именнованный канал mkfifo()
На сервере создаешь и открываешь файл
C
1
2
3
   FILE * f;
   mkfifo("./filename", 0600); 
  f = fopen("./filename", "w");
на клиенте просто открываешь и читаешь
C
1
2
   FILE * f;
  f = fopen("./filename", "r");
1
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
13.12.2013, 16:34  [ТС]
gyplex,

вот что получилось но я не уверен что оно будет работать.
клиент (описание функций, нахождение min, max элементов и сортировка )
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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#define PERM 0666
FILE * f;
int f;
f = fopen("./fifo", "r"); 
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;
}
сервер (ввод и вывод массива)

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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#define PERM 0666
FILE * f; 
int f;
main() {
  mkfifo("./fifo", 0600); 
  f = fopen("./fifo", "w");
  int m[4][5]= {77,2,3,4,5,  20,30,40,50,60,  18,16,14,12,10,  6,7,80,9,10};
 {
    int imin= find_min (m[0], 20);
    printf ("min: [%d,%d]= %d\n", imin / 5, imin % 5, m[imin / 5][imin % 5]);
   
  }
 {
    int imax= find_max (m[0], 20);
    printf ("max: [%d,%d]= %d\n", imax /  5, imax % 5, m[imax / 5][imax % 5]);
  }
close f;
  return 0;
}
В чем ошибки??
0
 Аватар для Dizark
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 84
14.12.2013, 00:29
Я немного не понял, что именно вам нужно сделать, кто отправляет массив данных...

Вот мой пример реализации передачи данных через именованный канал.

Программа клиент - отправляет массив чисел в канал
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
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (void)
{
    int mas[] = {0, 1, -3, 53, 4, 32, 7, 2, 6, -234};
    FILE *fd;
    int n, num;
    char buf[256], str[10];
 
    fd = fopen ("./myfifo", "w");
    *buf = 0;
 
    num = sizeof (mas) / sizeof (int);
 
    if (fd)
    {
        for (n = 0; n < num-1; n++)
            fprintf (fd, "%d, ", mas[n]);
        fprintf (fd, "%d", mas[num-1]);
    }
    
    fclose (fd);
 
    return 0;
}
Программа сервер, принимает данные из канала, выводит, что она приняла и после этого находит минимальный и максимальный элемент массива.
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
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <string.h>
 
int main (void)
{
    FILE *fd;
    int length, min, max, num;
    char buf[512], *p;
 
    mkfifo ("./myfifo", 0600);
 
    fd = fopen ("./myfifo", "r");
    if (!fd)
    {
        perror ("fifo open");
        exit (1);
    }
 
    while (1)
    {
        length = fread (buf, 1, sizeof (buf), fd);
        if (length)
        {
            buf[length] = 0;
            printf ("Считано %d байт: %s\n", length, buf);
 
            min = atoi (buf);
            max = min;
            p = strchr (buf, ',');
            while (p)
            {
                p++;
                num = atoi (p);
                if (num > max) max = num;
                if (num < min) min = num;
                p = strchr (p, ',');
            }
        printf ("Максимальный элемент: %d.\nМинимальный элемент: %d.\n", max, min); 
        }
    }
    fclose (fd);
}
1
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
14.12.2013, 01:44  [ТС]
Dizark, вы правильно поняли, спасибо большое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2013, 01:44
Помогаю со студенческими работами здесь

Записать в именованный канал
Выполняю следующую команду в консоли: mkfifo mypipe Затем вторую команду: echo 'first' &gt; mypipe ВОТ ТУТ ТО И ПРОИСХОДИТ...

Хочу именованный virtual
Приветствую! WinAPI InitSecurityInterface() возвращает указатель на структуру, где почти каждое поле - указатель на функцию. Теперь мне...

Чат через именованный Pipe
Привет всем. Написал чат который запускается из двух файлов на одном компьютере. Все делал через CreateNamedРipe. Можно ли реализовать...

Syslog и запись в именованный канал
Всем доброго времени суток. Захотел я реализовать такую связку squid -&gt; syslog -&gt; squidpipe -&gt; logs_to_mysql -&gt; mysql. То есть, сквид...

Php и именованный диапазон Excel
Работаю с Excel, нужно с помощью php найти именованный диапазон, как это сделать? Использую для работы с Excel - Spreadsheet_Excel_Reader.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru