Программа приема сообщений печатает только каждое другое сообщение
Я реализовал две программы из раздела 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;
}