I was trying to create a program where the master keeps sending messages to user processes. Each time the user process receives a message it should send an acknowledgment (send a message back to master) saying it received the message and pick a random number between 1-3. So I set up a while(1) in the user process. But what is happening is the user process after receiving the message keeps looping around till it terminates and only then it sends a meesage back to master.
I just wanted the user process to pick a number send the message back but the user process is:
pick a number send message
pick a number send message
pick a number send message
UPDATE I tried to add sleep(1) after msgsend from user to master to give the control to master but this it still is not doing anything. Tried to remove the while loop but this is giving me trouble the second time the process receives a message.
This is the code so far: user.c
struct mesg_buffer {
long mesg_type;
int mesg_text[2];
} message;
void main()
{
int pid=getpid();
int error1;
printf("\nhello from %d\n",getpid());
int times=0,timen=0,zero=0,randomnum,timelimit,n=0,sum,i;
int msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid==-1)
perror("User:error in message get");
else
printf("msgid=%d\n",msgid);
while(1)
{
error1=msgrcv(msgid, &message, sizeof(message), pid, 0);
if(error1==-1)
perror("User: Error in receieving message from OSS ");
else
{
printf("In User: Data received from oss\n");
int work=(rand() % (3)) + 1;
printf("random work %d\n",work);
if(work==1)
{
printf("the process is ending\n");
message.mesg_text[0]=pid;
message.mesg_text[1]=1;
if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
perror("error in sending message back to OSS");
else
printf("message sent to oss now I can die in peace\n");
exit(0);
}
if(work==2)
{
message.mesg_text[0]=pid;
message.mesg_text[1]=2;
if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
perror("error in sending message back to OSS");
else
printf("message sent to oss now I can die in peace\n");
}
if(work==3)
{
message.mesg_text[0]=pid;
message.mesg_text[1]=3;
if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
perror("error in sending message back to OSS");
else
printf("message sent to oss now I can die in peace\n");
}
}//endif
}
master.c
int sendm=msgsnd(msgid, &message, sizeof(message), 0);
if( sendm==-1)
perror("error in sending message to user process");
else
{
printf("message sent to process %d\n",currentprocessPID);
currentprocessstarted=true;
//do some stuff
}
//receive message from user
if(msgrcv(msgid, &message, sizeof(message), currentprocessPID, 0)==-1)
perror("error in recieving message from user process");
else
{
printf("message received from %d\n",message.mesg_text[0]);
if(message.mesg_text[1]==1)
{
printf("process %d wants to terminate\n",currentprocessPID);
int corpse,status;
while ((corpse = waitpid(message.mesg_text[0], &status, 0)) != message.mesg_text[0] && corpse != -1)
{
char pmsg[64];
snprintf(pmsg, sizeof(pmsg), "logParse: PID %d exited with status 0x%.4X", corpse, status);
perror(pmsg);
}
}
else if(message.mesg_text[1]==2)
{
//do some stuff
}
else if(message.mesg_text[1]==3)
{
//do some stuff
}
printf("%d process is done with its work\n",message.mesg_text[0]);
My Output
hello from 15496
msgid=67272706
In User: Data received from oss
random work 2
message sent to oss now I can die in peace
In User: Data received from oss
random work 2
message sent to oss now I can die in peace
In User: Data received from oss
random work 1
the process is ending
message sent to oss now I can die in peace
message sent to process 15496
message received from 15496
process 15496 wants to terminate
15496 process is done with its work