loom

Форк
0
89 строк · 2.3 Кб
1
/*
2
MIT License
3

4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5

6
https://bmstu.codes/lsx/simodo
7
*/
8

9
#include "simodo/messaging/InterprocessCommunication.h"
10
#include "simodo/inout/convert/functions.h"
11

12
#include <iostream>
13
#include <fstream>
14
#include <chrono>
15
#include <thread>
16
#include <condition_variable>
17

18
using namespace simodo;
19
using namespace std::chrono_literals;
20

21
int main(int argc, char *argv[])
22
{
23
    if (argc < 2) {
24
        std::cout << "Не задано имя командного файла" << std::endl;
25
        return 1;
26
    }
27

28
    if (argc < 3) {
29
        std::cout << "Не задано имя процесса" << std::endl;
30
        return 1;
31
    }
32

33
    std::string    cmd = argv[1];
34
    std::istream * in;
35

36
    if (cmd.empty())
37
        in = &std::cin;
38
    else {
39
        in = new std::ifstream(cmd);
40

41
        if (!*in) {
42
            std::cout << "Ошибка при открытии командного файла" << std::endl;
43
            return 1;
44
        }
45
    }
46

47
    std::string              process = argv[2];
48
    std::vector<std::string> arguments(argv + 3, argv + argc);
49

50
    messaging::InterprocessCommunication ipc(process, arguments);
51

52
    bool                    completion_flag = false;
53
    std::condition_variable completion_condition;
54

55
    bool ok = ipc.open([&](std::string & s) {
56
                std::cout << s << std::endl;
57
                if (s == "The work is completed") {
58
                    completion_flag = true;
59
                    completion_condition.notify_all();
60
                }
61
            });
62

63
    if (!ok) {
64
        std::cout << "Ошибка при открытии канала связи: " << ipc.last_error() << std::endl;
65
        return 1;
66
    }
67

68
    std::string line;
69
    while(std::getline(*in, line) && !line.empty())
70
        ipc.send(line);
71

72
    std::mutex                   completion_mutex;
73
    std::unique_lock<std::mutex> locker(completion_mutex);
74

75
    if (!completion_condition.wait_for(locker, 5000ms, [&]{ return completion_flag; })) {
76
        ipc.close();
77
        std::cout << "Таймаут в канале" << std::endl;
78
        return 1;
79
    }
80

81
    ipc.close();
82

83
    if (!ipc.last_error().empty()) {
84
        std::cout << "Ошибка канала связи: " << ipc.last_error() << std::endl;
85
        return 1;
86
    }
87

88
    return 0;
89
}
90

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.