Передача данных между приложениями. C++

Есть одна программа, которая получает данные с gps приемника по протоколу NMEA. Далее она парсит эти данные и делает уже последующую обработку. Так сложились обстоятельства, что данного приемника больше нет, а программу дописать очень хочется. Я придумал решение. Создал другую программу, которая генерирует эти самые nmea-sentences. Программа-генератор создает строку std::string в стиле протокола каждые n секунд. Задержка осуществляется с помощью std::this_thread::sleep_for(n);

Вопрос состоит в следующем: Как я могу передавать эти данные в реальном времени в свою первую программу. (пробовал пайпы, но там проблема в том, что я передаю бесконечным циклом данные, а вторая программа может их считать, только когда я прекращаю запись первой программой).

Дополнение

Для примера привожу программу записи в файл:

// в данном случае использую текстовый файл, 
// чтобы нормально отслеживать порядок событий
int main() {
std::string path = "pipe/PipeGSVsentence.txt";
std::ofstream file(path);

if (file.is_open()) {
    for (size_t i = 0; i < 50; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        file << i << " HELLO WORLD %1 \n";
        file.flush();
    }
    file.close();
} else {
    std::cout << "Не удалось открыть файл." << std::endl;
}
 return 0;
}

Вопрос такой: Как правильно читать файл, чтобы в консоль выводились новые строки в момент записи в файл другой программой? Пробовал что-то подобное:

int main() {

std::string path = "pipe/PipeGSVsentence.txt";

std::ifstream file;
    file.open(path);
if (file.is_open()) {
    std::string line;
    while (true) {
        while (std::getline(file, line)) {
            std::cout << "Прочитано: " << line << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
    file.close();
} else {
    std::cout << "Не удалось открыть файл." << std::endl;
}
return 0;
}

В данной ситуации программа читает пару строк и зависает в бесконечном цикле.

Придумал вариант: в программе, записывающей строки, реализовать такой цикл:

  1. открыть файл
  2. записать строку
  3. закрыть файл

в программе читателе следующий цикл:

  1. открыть файл
  2. прочитать строки
  3. закрыть файл

Но мне кажется есть что-то поэффективнее, до чего я не могу додуматься и не могу найти. Да и плюсом, если использовать pipe, то одна из программ в какой-то момент завершится по причине SIGPIPE


Ответы (1 шт):

Автор решения: maestro

Раз ваша программа получает данные с аппаратного устройства, то она должна делать это через какой-то аппаратный интерфейс. Обычно это COM-порт. Существует возможность создать два виртуальных закольцованных порта так, что при отправке данных на один порт они будут появляться на втором. Таким образом, можно симулировать наличие аппаратного устройства.

Для создания таких портов существуют специальные драйверы. Например, для windows это com0com, для linux - tty0tty. Для macos поищите по запросу Virtual null modem emulator.

Любые другие способы ведут к необходимости менять процедуру обмена данными с аппаратным устройством, здесь же приём и передача останутся без изменений.

→ Ссылка