Ipc

BashOrgRu

Well-known member
15.03.2009
77
0
#1
Имеется такая задача:
"Написать две программы, общающиеся через очередью Одна программа – мастер – получает сообщения, генерируемые другой программой - отправителем( текст + любая индентифицирующая информация). Работают 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 раз отправитель, а затем запускал мастера, он мне выводил все сообщения по порядку и закрывался.
Теперь собственно вопрос: правильно ли я вобще понял задание и сделал его?
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
2 l1pton17 : Актуальность темы еще имеется??? Задание очень интересное....