Получатель печатает свое имя т содержимое сообщений
отправитель работает пока не введется EOF тогда он рассылает всем получателям сообщение-ограничитель получатель в свою очередь отправляет отправителю подтверждение того что он получил ограничитель и удаляет очередь
вот собственно код отправителя
Код: Выделить всё
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct {long type;
char msg[256];
} messageto;
struct {
long type;
int msg;
} messagefrom;
int main(){
key_t key;
int msid;
char buf[256];
int bint[256];
int i=0;
int k;
key=ftok("blabla",'g');
msid=msgget(key, 0666| IPC_CREAT);
msgrcv(msid, &messagefrom, sizeof(messagefrom),1,0);
printf("gaga\n");
printf("%d", messagefrom.msg);
bint[i]=messagefrom.msg;
i++;
for(;;){
if(msgrcv(msid, &messagefrom, sizeof(messagefrom)+1,1,IPC_NOWAIT )){
bint[i]=messagefrom.msg;
i++;
continue;}
printf(">");
gets(buf);
////////////////////////
if (!strcmp(buf, "EOF")){
strcpy(messageto.msg, buf);
messageto.type=0;
msgsnd(msid, &messageto, strlen(buf)+1, 0 );
break;}
/////////////////////////////////////////////
for(k=0;k<=i;k++){
strcpy(messageto.msg, buf);
messageto.type=bint[k];
msgsnd(msid, &messageto, strlen(buf)+1, 0 );}
///////////////////////////////////
}
if(msgrcv(msid, &messagefrom, sizeof(messagefrom)+1, 3, 0)!=-1){
printf("%s\n",messagefrom.msg);
msgctl(msid, IPC_RMID, 0);}
////////////////////////////
return 0;
}вот код получателя
Код: Выделить всё
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct {long type;
char msg[256];
} messageto;
struct {
long type;
int msg;
} messagefrom;
int main(int argc, char** argv){
key_t key;
char buf[256];
int msid;
key=ftok("blabla",'g');
int a;
int pid;
msid=msgget(key, 0666|IPC_CREAT);
pid=getpid();
messagefrom.type=1;
messagefrom.msg=pid;
msgsnd(msid, &messagefrom, sizeof(messagefrom), 0 );
for(;;){
if(msgrcv(msid, &messageto, sizeof(messageto), pid, 0)!=-1){
printf("%s\t%s\n", messageto.msg, argv[0]);
continue;}
//////////////////////////////////////////////////////////
if(msgrcv(msid, &messageto, sizeof(messageto), 0, IPC_NOWAIT)!=-1){
printf("%s", messageto.msg);
messagefrom.type=3;
messagefrom.msg=-999;
msgsnd(msid, &messagefrom, sizeof(messagefrom)+1, 0);
msgctl(msid, IPC_RMID, 0);
break;}
///////////////////////////////////////////////////////////
}
exit(0);}запускаю в 2ух разных окошках запускаю отправитель запускаю получатель
сразу после запуска получателя в момент когда он присылает свой пид отправителю вываливается кордамп он успевает напечатать отладочную печать "gaga" после этого кордамп((
плз посмотрите в чем может быть дело очень надеюсь на вашу помощ