Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 消息队列消息接收提供错误无效参数_C_Message Queue_Msgrcv - Fatal编程技术网

C 消息队列消息接收提供错误无效参数

C 消息队列消息接收提供错误无效参数,c,message-queue,msgrcv,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 mes

对于消息队列来说非常陌生,当我从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;
}
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);
}

请阅读:我删除标题的唯一原因是因为我的代码太长,无法发布。此外,这是我复制问题所必须输入的最小值。这些是标题:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#包括#包括#包括#包括#包括#包括#包括