Ipc

Тема в разделе "C/C++/C#", создана пользователем BashOrgRu, 4 дек 2010.

  1. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Имеется такая задача:
    "Написать две программы, общающиеся через очередью Одна программа – мастер – получает сообщения, генерируемые другой программой - отправителем( текст + любая индентифицирующая информация). Работают n копий отправителя. Мастер распечатывает сообщения (указывая перед ним информацию, идентифицирующую отправителя). Перед завершением работы отправитель посылает сообщение-ограничитель. После получения такого сообщения от всех отправителей мастер удаляет очередь."

    Вот что я сделал, первый - мастер, принимает указанное в N кол-во сообщений и закрывается, вторая - отправитель - посылает сообщение с текстом, вёденного в качестве аргумента командой строки(из argv[][]). Исходник отправителя сохранить как client.c
    Мастер:
    Код (C++):
    #include <sys/types.h>
    #include <sys/ipc.h>#include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define BLOCK_MESSAGE 255

    int main()
    {
    const N=4; // Кол-во принимаемых сообщений
    int msqid,i=0,len, maxlen=81;
    char pathname[] = "client.c";
    key_t key;
    struct msgbuf
    {
    long type;
    char text[maxlen];
    } buf;

    if((key = ftok(pathname,0)) < 0)
    {
    printf("Не могу сгенерировать ключ.\n");
    exit(-1);
    }
    if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0)
    {
    printf("Не могу получить msqid\n");
    exit(-1);
    }
    while(1)
    {
    if (( len = msgrcv(msqid,(struct msgbuf *) &buf, maxlen, 0, 0)) < 0)
    {
    printf("Не могу получить сообщение из очереди.\n");
    exit(-1);
    }
    if (buf.type == BLOCK_MESSAGE) i++;
    else
    printf("Тип сообщения = %ld, текст: %s\n",buf.type, buf.text);
    if (i==N)
    {
    msgctl(msqid, IPC_RMID,(struct msqid_ds *) NULL);
    exit(0);
    }
    }
    return 0;
    }
    Отправитель:
    Код (C++):
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define BLOCK_MESSAGE 255

    int main(int argc, char *argv[])
    {
    int msqid;
    char pathname[] = "client.c",message[] = "Сообщение от программы с ИД: ";
    key_t key;
    int len,maxlen=81;
    struct msgbuf
    {
    long type;
    char text[maxlen=81];
    } buf;


    if (argc==1)
    {
    printf("Не указан параметр.\n");
    exit(-1);
    }
    if((key = ftok(pathname,0)) < 0)
    {
    printf("Не могу сгенерировать ключ.\n");
    exit(-1);
    }
    if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0)
    {
    printf("Не могу получить msqid\n");
    exit(-1);
    }
    buf.type = 1;
    strcpy(buf.text, message);
    strcat(buf.text,argv[1]);
    len = strlen(buf.text)+1;
    if (msgsnd(msqid, (struct msgbuf *) &buf,len, 0) < 0)
    {
    printf("Не могу послать сообщение.\n");
    msgctl(msqid, IPC_RMID,(struct msqid_ds *) NULL);
    exit(-1);
    }
    buf.type = BLOCK_MESSAGE;
    len = 0;
    if (msgsnd(msqid, (struct msgbuf *) &buf,len, 0) < 0)
    {
    printf("Не могу послать сообщение.\n");
    msgctl(msqid, IPC_RMID,(struct msqid_ds *) NULL);
    exit(-1);
    }
    return 0;
    }
    Тестировал так: запускал N раз отправитель, а затем запускал мастера, он мне выводил все сообщения по порядку и закрывался.
    Теперь собственно вопрос: правильно ли я вобще понял задание и сделал его?
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2 l1pton17 : Актуальность темы еще имеется??? Задание очень интересное....
     
Загрузка...
Похожие Темы - Ipc
  1. street
    Ответов:
    0
    Просмотров:
    1.105

Поделиться этой страницей