ipc средства очередь сообщений core dump((

Модератор: Модераторы разделов

inlines
Сообщения: 10
ОС: kubuntu 7.10

ipc средства очередь сообщений core dump((

Сообщение inlines »

написал 2 проги отправитель и получатель отправитель текст с клавы рассылает в виде сообщения нескольким копиям получателя
Получатель печатает свое имя т содержимое сообщений
отправитель работает пока не введется 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" после этого кордамп((

плз посмотрите в чем может быть дело очень надеюсь на вашу помощ
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: ipc средства очередь сообщений core dump((

Сообщение Uncle_Theodore »

msgget надо проверять на успешное завершение. Что-то типа
if ((msqid = msgget(key, msgflg)) == -1)
{
perror("msgget: msgget failed");
exit(1);
} else
Спасибо сказали: