C 消息队列消息接收提供错误无效参数
对于消息队列来说非常陌生,当我从pikabo.c向master.c发送消息时,我遇到了一个错误。我最初认为我的msgget()有问题,但master可以向pikabo.c发送消息,pikabo也可以读取它 我写这些行是因为我的问题不是发帖 这是我的代码: master.cC 消息队列消息接收提供错误无效参数,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
//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#包括#包括#包括#包括#包括#包括#包括