Очередь сообщений получает сообщение об ошибке неверный аргумент - PullRequest
0 голосов
/ 16 октября 2019

Очень плохо знаком с очередями сообщений, и я получаю сообщение об ошибке при отправке сообщения из pikabo.c в master.c. Сначала я думал, что что-то не так с моим msgget (), но мастер может отправить сообщение на pikabo.c, а pikabo может прочитать его.

Я пишу эти строки, потому что в противном случае мой вопрос непроводка.

Это мой код: master.c

//global variables
int shmid;
int msgid;
long currentprocessPID;
key_t shmkey;

struct mesg_buffer {
    long mesg_type;
    int mesg_text[4];
} message;
void startprocess()
{

    int i;
        pid_t pID = fork();
        if (pID < 0)
        {
            perror("Failed to fork:");
            exit(EXIT_FAILURE);
        }
        //launch user process and send a message to it using PID as msg type
        else if (pID == 0)
        {
            static char *args[]={"./pikabo",NULL};
            int status;
            if(( status= (execv(args[0], args)))==-1)
            {
                perror("failed to execv");
                exit(EXIT_FAILURE);
            }
            else
                printf("\n message sent to user sucessfully");
        }
        //send a message to user
        currentprocessPID=pID;
        message.mesg_type = currentprocessPID;
        if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
            perror("error in sending message to user process");
        else
        {
            printf("\nmessage sent to process %ld",currentprocessPID);
            //do some stuff
        }
        //wait for a message back from user
        if(msgrcv(msgid, &message, sizeof(message), currentprocessPID, 0)==-1)
            perror("error in recieving message from user process");
        else
        {
            printf("\n%d process is done with its work",message.mesg_text[0]);
            int arg1=message.mesg_text[1];//cpu time used by the user process seconds
            int arg2=message.mesg_text[2];//cpu time used by the user process nanoseconds
        }
}
int main(int argc, char **argv)
{      shmkey = ftok("makefile",777);
        if (shmkey == -1) {
            perror("Ftok failed");
            exit(-1);
        }
        msgid = msgget(shmkey, 0666 | IPC_CREAT);
        startprocess();
    return 0;
}

pikabo.c

int shmid;
struct mesg_buffer {
    long mesg_type;
    int mesg_text[4];
} message;
void main()
{
        long pid=getpid();
        printf("\n\nhello from %d",getpid());

        key_t shmkey = ftok("makefile",777);
        if (shmkey == -1) {
            perror("Ftok failed");}
        int msgid = msgget(shmkey, 0666 | IPC_CREAT);
        while(1)
            {
                if(msgrcv(msgid, &message, sizeof(message), getpid(), 0))
                {
                    printf("\nDate received");

                        message.mesg_type = pid;
                        message.mesg_text[0]=pid;
                        message.mesg_text[1] = locals;
                        message.mesg_text[2]=localn;
                        message.mesg_text[3]=1;
                        if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
                            perror("error in sending message back");
                        exit(0);
                }
            }//endwhile
        exit(0);
}
...