Программа приема сообщений печатает только каждое другое сообщение

Я реализовал две программы из раздела 7.6 http://beej.us/guide/bgipc/output/html/multipage/mq.html.

Я расширил его так, что есть две принимающие программы, и какая из них зависит от типа сообщения.

Проблема возникает в принимающей программе B и C. Предполагается, что они должны распечатывать сообщения, введенные в программу A, каждый раз, но только в другое время.

Это то место, куда отправляется сообщение, оно читает первые 6 символов и, если оно СРОЧНО, устанавливает тип сообщения.

buf.mtype = 2;

while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {
        int len = strlen(buf.mtext);

        strncpy(typeTest, buf.mtext, 6);

        if(strncmp(typeTest, "URGENT", 6) == 0){
            buf.mtype = 1;
        }       

        printf("This is the message %s \n", buf.mtext);

        /* ditch newline at end, if it exists */
        if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';

        if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
            perror("msgsnd");
    }

Это то место, где сообщение получено, тогда оператор if проверяет тип и затем распечатывает.

for(;;) { /* Spock never quits! */
        if (msgrcv(msqid, &buf, sizeof buf.mtext, 0, 0) == -1) {
            perror("msgrcv");
            exit(1);
        }

        if(buf.mtype == 2){
            printf("spock: \"%s\"\n", buf.mtext);
        }
    }

Может кто-нибудь пролить свет на то, почему он печатает только все остальные сообщения?

Благодарю.

1 ответ

Решение

В вашей программе А вы должны установить buf.mtype в 2, если вход не "СРОЧНО..." Вы должны делать это в цикле, каждый раз.

while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {
    int len = strlen(buf.mtext);

    strncpy(typeTest, buf.mtext, 6);

    if(strncmp(typeTest, "URGENT", 6) == 0){
        buf.mtype = 1;
    }       
    else buf.mtype= 2;    // always set the default

    printf("This is the message %s \n", buf.mtext);

    /* ditch newline at end, if it exists */
    if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';

    if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
        perror("msgsnd");
}

В ваших программах B и C вы должны установить msgtyp 1 или 2 для каждой программы, чтобы получить правильное сообщение из очереди, например:

int main(argc, argv)
{
    int msgtype;
    if (*argv[1]=='A')
        msgtype= 1;
    else if (*argv[1]=='B')
        msgtype= 2;
    else
        msgtype= 0;
    ...
    for(;;) { /* Spock never quits! */
        if (msgrcv(msqid, &buf, sizeof buf.mtext, msgtype, 0) == -1) {
            perror("msgrcv");
            exit(1);
        }

        if(buf.mtype == msgtype){
            printf("spock: \"%s\"\n", buf.mtext);
        }
    }
    return 0;
}
Другие вопросы по тегам