Очень плохо знаком с очередями сообщений, и я получаю сообщение об ошибке при отправке сообщения из 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);
}