消息队列消息接收给出错误无效参数

时间:2019-10-16 03:42:12

标签: c message-queue msgrcv

消息队列的新手,当我从pikabo.c向master.c发送消息时出现错误。最初我以为我的msgget()出了问题,但是master可以将消息发送到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);
}

0 个答案:

没有答案