簡體   English   中英

Boost::Process Pipe 流和單元測試

[英]Boost::Process Pipe Streams and Unit Test

我有兩個 stream 這樣的來源:

bp::ipstream StdOut;
bp::opstream StdIn;
bp::child MyProcess = bp::child(processPath, bp::std_out > StdOut, bp::std_in < StdIn);
// Doing some stuff with StdOut and StdIn

我想知道是否有辦法手動寫入這個 StdOut 並從 StdIn 讀取以進行單元測試? 非常感謝!

您可以像普通的 stream 一樣寫信給他們:

住在科利魯

#include <boost/process.hpp>
#include <iostream>

namespace bp = boost::process;

int main() {
    bp::ipstream StdOut;
    bp::opstream StdIn;
    bp::child MyProcess = bp::child("/usr/bin/rev", bp::std_out > StdOut, bp::std_in < StdIn);

    for (int i = 0; i<100; ++i) {
        StdIn << "Sure no problem, " << i << std::endl;
    }
    StdIn.flush();
    StdIn.pipe().close();

    std::string il;
    while (getline(StdOut, il)) {
        std::cout << il << std::endl;
    }

    std::cout << "Bye\n";
}

印刷

0 ,melborp on eruS
1 ,melborp on eruS
2 ,melborp on eruS
...
99 ,melborp on eruS
Bye

異步版本

請注意,就像文檔警告的那樣,如果您的進程需要異步 IO 您最終可能會出現死鎖(例如,在子進程等待輸入時等待 output)。

為此,請使用 Asio 的異步操作:

住在科利魯

#include <boost/process.hpp>
#include <boost/asio.hpp>
#include <boost/process/async.hpp>
#include <iostream>

namespace ba = boost::asio;
namespace bp = boost::process;

int main() {
    ba::io_context io;
    bp::async_pipe ip(io), op(io);
    //bp::async_pipe StdIn(io);

    bp::child MyProcess = bp::child("/usr/bin/tac", bp::std_out > op, bp::std_in < ip, io);

    std::function<void()> send_loop, recv_loop;

    ba::streambuf sb;
    send_loop = [&, i=0]() mutable {
        if (++i<100) {
            std::ostream(&sb) << "Sure no problem, " << i << std::endl;
            ba::async_write(ip, sb, [&send_loop](auto ec, auto /*tx*/) {
                //std::cout << "Sent " << tx << " bytes (" << ec.message() << ")\n";
                if (!ec) send_loop();
            });
        } else ip.close();
    };

    ba::streambuf rb;
    recv_loop = [&]() {
        ba::async_read_until(op, rb, "\n", [&](auto ec, auto /*tx*/) {
            //std::cout << "Received " << tx << " bytes (" << ec.message() << ")\n";
            std::cout << &rb << std::flush;
            if (!ec) recv_loop();
        });
    };

    io.post(send_loop);
    io.post(recv_loop);
    io.run();

    std::cout << "Bye\n";
}

打印預期:

Sure no problem, 99
Sure no problem, 98
Sure no problem, 97
Sure no problem, 96
Sure no problem, 95
Sure no problem, 94
Sure no problem, 93
Sure no problem, 92
Sure no problem, 91
Sure no problem, 90
Sure no problem, 89
Sure no problem, 88
Sure no problem, 87
Sure no problem, 86
Sure no problem, 85
Sure no problem, 84
Sure no problem, 83
Sure no problem, 82
Sure no problem, 81
Sure no problem, 80
Sure no problem, 79
Sure no problem, 78
Sure no problem, 77
Sure no problem, 76
Sure no problem, 75
Sure no problem, 74
Sure no problem, 73
Sure no problem, 72
Sure no problem, 71
Sure no problem, 70
Sure no problem, 69
Sure no problem, 68
Sure no problem, 67
Sure no problem, 66
Sure no problem, 65
Sure no problem, 64
Sure no problem, 63
Sure no problem, 62
Sure no problem, 61
Sure no problem, 60
Sure no problem, 59
Sure no problem, 58
Sure no problem, 57
Sure no problem, 56
Sure no problem, 55
Sure no problem, 54
Sure no problem, 53
Sure no problem, 52
Sure no problem, 51
Sure no problem, 50
Sure no problem, 49
Sure no problem, 48
Sure no problem, 47
Sure no problem, 46
Sure no problem, 45
Sure no problem, 44
Sure no problem, 43
Sure no problem, 42
Sure no problem, 41
Sure no problem, 40
Sure no problem, 39
Sure no problem, 38
Sure no problem, 37
Sure no problem, 36
Sure no problem, 35
Sure no problem, 34
Sure no problem, 33
Sure no problem, 32
Sure no problem, 31
Sure no problem, 30
Sure no problem, 29
Sure no problem, 28
Sure no problem, 27
Sure no problem, 26
Sure no problem, 25
Sure no problem, 24
Sure no problem, 23
Sure no problem, 22
Sure no problem, 21
Sure no problem, 20
Sure no problem, 19
Sure no problem, 18
Sure no problem, 17
Sure no problem, 16
Sure no problem, 15
Sure no problem, 14
Sure no problem, 13
Sure no problem, 12
Sure no problem, 11
Sure no problem, 10
Sure no problem, 9
Sure no problem, 8
Sure no problem, 7
Sure no problem, 6
Sure no problem, 5
Sure no problem, 4
Sure no problem, 3
Sure no problem, 2
Sure no problem, 1
Sure no problem, 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM