2016-02-16 2 views
-4

Любые рекомендации о том, как msg1.cpp может ввести второй цикл? Я компилирую и выполняю обе программы и не получаю сообщений об ошибках. Когда я компилирую и выполняю msg2.cpp, он запрашивает у пользователя «Ввод текста». Когда пользователь вводит текст, msg1.cpp отображает ввод пользователя. Проблема заключается в том, что msg1.cpp не запрашивает пользователя «Введите текст», потому что он не входит в цикл. Строка 64 - это когда программа должна вводить цикл. Программа должна работать, потому что запуск уже не равен нулю, равный единице! Не собираюсь публиковать исходный код msg2.cpp, потому что msg2.cpp не имеет ничего общего с моей проблемой.Программа не вводит второй цикл?

//msg1.cpp 
/* Here's the receiver program. */ 

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 

#define MAX_TEXT 512 
using namespace std; 

struct my_msg_st { 
    long int my_msg_type; 
    char some_text[BUFSIZ]; 
    //char some_text[MAX_TEXT]; 
}; 

int main() 
{ 
    int running = 1; 
    int msgid; 
    struct my_msg_st some_data; 
    long int msg_to_receive = 0; 
    char buffer[BUFSIZ]; 
    char some_text[MAX_TEXT]; 
    //string input; 

/* First, we set up the message queue. */ 

    msgid = msgget((key_t)1234, 0666 | IPC_CREAT); 

    if (msgid == -1) { 
     fprintf(stderr, "msgget failed with error: %d\n", errno); 
     exit(EXIT_FAILURE); 
    } 
/* Then the messages are retrieved from the queue, until an end message is encountered. 
Lastly, the message queue is deleted. */ 

    while(running) { 
     if (msgrcv(msgid, (void *)&some_data, BUFSIZ, 
        msg_to_receive, 0) == -1) { 
      fprintf(stderr, "msgrcv failed with error: %d\n", errno); 
      exit(EXIT_FAILURE); 
     } 
     printf("You wrote: %s", some_data.some_text); 
     if (strncmp(some_data.some_text, "end", 3) == 0) { 
      running = 1; 
     } 
    } 

    // msgctl performs control operations on system V message queue with identifier msqid 
    /*if (msgctl(msgid, IPC_RMID, 0) == -1) { 
     fprintf(stderr, "msgctl(IPC_RMID) failed\n"); 
     exit(EXIT_FAILURE); 
    }*/ 

    // Need to reset value, before entering second loop 
    // At this point enters loop, prompts user enter text 
    while(running) { 
     printf("Enter some text: "); 
     for (int i = 1; i < running; i++){ 
     fgets(buffer, BUFSIZ, stdin); 
     some_data.my_msg_type = 1; 
     strcpy(some_data.some_text, buffer); 
     } 
     if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) { 
      fprintf(stderr, "msgsnd failed\n"); 
      exit(EXIT_FAILURE); 
     } 
     if (strncmp(buffer, "end", 3) == 0) { 
      running = 0; 
     } 
    } 

    exit(EXIT_SUCCESS); 
} 
+4

Первый цикл выполняется, а 'while (running)' оценивается как 'true', но я никогда не вижу' running' установленного '0' или' break' из цикла. –

+0

C++ имеет булевский тип. 'running' выглядит как логическая переменная, но вы объявили ее как целое число. Зачем? – Steve

+0

Ничего, все это похоже на C-код в файле '.cpp' ... – Steve

ответ

1

Это потому, что, когда some_data.some_text равно "exit", вы установите running в один, а не нулевой. Вы должны сначала установить его на ноль, чтобы выйти из первого цикла.

Установите его на ноль и затем (после первого цикла) установите его на единицу.

+0

Я сделал эту коррекцию и программу, все еще не входящую в второй цикл! – ep7network

+1

@ ep7network, вы сделали 'running' равным единице перед вторым циклом? – ForceBru

+0

Да. Я изменил run = 1, оставив первый цикл! – ep7network

Смежные вопросы