0 / 0 / 1
Регистрация: 27.12.2012
Сообщений: 40
1

Двусторонняя связь двух программ через одну очередь сообщений

19.01.2014, 21:13. Показов 1962. Ответов 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
int main()
{  int msqid; /* IPC дескриптор для очереди сообщений */
   char pathname[] = "proc2.c"; /* Имя файла, для генерации ключа. */
   key_t key; /* IPC ключ */ 
   int maxlen, len, i; /* Счетчик цикла и длина информативной части сообщения */
    /* Пользовательская структура для сообщения */
    struct mymsgbuf
    {   long mtype;
        char msg[81];
    } mybuf;
    /* Генерирация IPC ключа и номера экземпляра очереди сообщений 0. */
    if((key = ftok(pathname,0)) < 0){
        printf("Can\'t generate key\n");
        exit(-1);
    }
    /* Получение доступа по ключу к очереди сообщений */ 
    if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){
        printf("Can\'t get msqid\n");
        exit(-1);
    } 
        /* Заполнение структуры сообщения и длины информативной части */ 
        mybuf.mtype = 1;
        strcpy(mybuf.msg,"Hello from proc1");
        len = strlen(mybuf.msg)+1;
        /* Отправка сообщений */ 
        if (msgsnd(msqid, (struct msgbuf *) &mybuf, len, 0) < 0){
            printf("Can\'t send message to queue\n");
            msgctl(msqid, IPC_RMID, (struct msqid_ds *) NULL);
            exit(-1);
        }
    
 /* mybuf.mtype = LAST_MESSAGE;
    len = 0;
    if (msgsnd(msqid, (struct msgbuf *) &mybuf, len, 0) < 0){
        printf("Can\'t send message to queue\n");
        msgctl(msqid, IPC_RMID, 
            (struct msqid_ds *) NULL);
        exit(-1);
    }*/
    i=1;
    while(1){
        /* Прием сообщений любого типа в порядке FIFO с максимальной длиной информативной части 81 символ до тех пор, пока не поступит сообщение с типом LAST_MESSAGE*/ 
        maxlen = 81;
        if ( len = msgrcv(msqid, (struct msgbuf *) &mybuf, maxlen, 0, 0) < 0){
            printf("Can\'t receive message from queue\n");
            exit(-1);
        }
/* Если принято сообщение типа LAST_MESSAGE, прекращаем работу и удаляем очередь сообщений из системы. В противном случае печатаем текст принятого сообщения. */
        if (mybuf.mtype == 2){
            printf("message type = %ld, message = %s %d\n", mybuf.mtype, mybuf.msg,i);
            i++;
            mybuf.mtype = 1;
        strcpy(mybuf.msg,"Hello from proc1");
        len = strlen(mybuf.msg)+1;
        /* Отправка сообщений */ 
        if (msgsnd(msqid, (struct msgbuf *) &mybuf, len, 0) < 0){
            printf("Can\'t send message to queue\n");
            msgctl(msqid, IPC_RMID, (struct msqid_ds *) NULL);
            exit(-1);
        }
        }
    }
    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
65
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#define LAST_MESSAGE 255 /* Тип сообщения для  прекращения работы второй программы */ 
int main()
{  int msqid; /* IPC дескриптор для очереди сообщений */
   char pathname[] = "proc2.c"; /* Имя файла, для генерации ключа. */
   key_t key; /* IPC ключ */ 
   int maxlen, len,i; /* Счетчик цикла и длина информативной части сообщения */
    /* Пользовательская структура для сообщения */
    struct mymsgbuf
    {   long mtype;
        char msg[81];
    } mybuf;
    /* Генерирация IPC ключа и номера экземпляра очереди сообщений 0. */
    if((key = ftok(pathname,0)) < 0){
        printf("Can\'t generate key\n");
        exit(-1);
    }
    /* Получение доступа по ключу к очереди сообщений */ 
    if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){
        printf("Can\'t get msqid\n");
        exit(-1);
    } 
        
    
    mybuf.mtype = LAST_MESSAGE;
    len = 0;
    strcpy(mybuf.msg,"Hello from proc2");
    if (msgsnd(msqid, (struct msgbuf *) &mybuf, len, 0) < 0){
        printf("Can\'t send message to queue\n");
        msgctl(msqid, IPC_RMID, 
            (struct msqid_ds *) NULL);
        exit(-1);
    }
    i=0;
    while(1){
        /* Прием сообщений любого типа в порядке FIFO с максимальной длиной информативной части 81 символ до тех пор, пока не поступит сообщение с типом LAST_MESSAGE*/ 
        maxlen = 81;
        if ( len = msgrcv(msqid, (struct msgbuf *) &mybuf, maxlen, 0, 0) < 0){
            printf("Can\'t receive message from queue\n");
            exit(-1);
        }
/* Если принято сообщение типа LAST_MESSAGE, прекращаем работу и удаляем очередь сообщений из системы. В противном случае печатаем текст принятого сообщения. */
        if (mybuf.mtype == 1)
    {
    printf("message type = %ld,message = %s %d\n",mybuf.mtype, mybuf.msg,i);
    i++;
    /* Заполнение структуры сообщения и длины информативной части */ 
    mybuf.mtype = 2;
    strcpy(mybuf.msg,"Hello from proc2");
    len = strlen(mybuf.msg)+1;
        /* Отправка сообщений */ 
        if (msgsnd(msqid, (struct msgbuf *) &mybuf, len, 0) < 0)
        {
        printf("Can\'t send message to queue\n");
        msgctl(msqid, IPC_RMID, (struct msqid_ds *) NULL);
        exit(-1);
        }
        }
    }
    return 0;
}


Вообщем вопрос в том, что при запуске программе, все работает, но почему-то зацикливается и вот почему? Я не могу понять. Помогите, пожалуйста.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2014, 21:13
Ответы с готовыми решениями:

Связь двух программ через инет
Привет! Я спаял один девайсик который подключается к компу может управлять электро нагрузками с...

Связь двух программ через файл данных
(среда С++ Builder). (Интеграция технологических процессов) Как автоматизировать работу 2...

Связь двух сетей в одну
здравствуйте. помогите решить задачу. есть два роутера 192.168.0.1 и 192.168.1.1 и соответственно...

Двусторонняя очередь
Как реализовать двустороннюю очередь для сохранения и работы с динамическими данными?

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2014, 21:13

двусторонняя очередь
помогите создать программу...вот условие задачи:создать класс-дек(двусторонняя очередь).определить...

Реализация передачи указателя на объект через очередь сообщений
У меня есть объект(Variant). Мне надо , с помошью очереди сообщений , передать указатель на него из...

Класс двусторонняя очередь
Проблема: С методом pop_back(удалением с конца) Так-же помогите перезагрузить оператор(Выводит...

Двусторонняя очередь (ДЕК)
Помогите пожалуйста реализовать дек : Нарисовал uml диаграмму , но как сделать не знаю , должно...


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

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

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