Как очистить сообщение из очереди сообщений после его прочтения? - PullRequest
0 голосов
/ 21 октября 2019

Я пытался создать программу, в которой мастер продолжает отправлять сообщения пользовательским процессам. Каждый раз, когда пользовательский процесс получает сообщение, он должен отправить подтверждение (отправить сообщение обратно мастеру), сообщив, что получил сообщение, и выбрать случайное число в диапазоне 1-3. Поэтому я настроил некоторое время (1) в пользовательском процессе. Но происходит то, что пользовательский процесс после получения сообщения продолжает зацикливаться до тех пор, пока не завершится, и только тогда он отправляет сообщение обратно мастеру. Я просто хотел, чтобы пользовательский процесс выбрал номер для отправки сообщения обратно, но пользовательский процесс:
выберите номер для отправки сообщения
выберите номер для отправки сообщения
выберите номер для отправки сообщения

ОБНОВЛЕНИЕ Я попытался добавить sleep (1) после msgsend от пользователя к мастеру, чтобы передать управление мастеру, но это все равно ничего не делает. Попытался удалить цикл while, но это доставляет мне неприятности во второй раз, когда процесс получает сообщение.

Это код на данный момент: 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Выход

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
...