libfilezilla
process.cpp

A simple demonstration of using fz::process This example spawns the timer_fizzbuzz::cpp demo and controls it via the redirected IO.

#include <libfilezilla/process.hpp>

#include <iostream>
#include <string>

namespace {
// Helper function to extract a directory from argv[0] so that the
// demos can be run independent of the current working directory.
fz::native_string get_program_dir(int argc, char ** argv)
{
    std::string path;
    if (argc > 0) {
        path = argv[0];
#ifdef FZ_WINDOWS
        auto delim = path.find_last_of("/\\");
#else
        auto delim = path.find_last_of("/");
#endif
        if (delim == std::string::npos) {
            path.clear();
        }
        else {
            path = path.substr(0, delim + 1);
        }
    }

    return fz::to_native(path);
}

#ifdef FZ_WINDOWS
auto suffix = fzT(".exe");
#else
auto suffix = fzT("");
#endif
}

int main(int argc, char *argv[])
{
    // Start the timer_fizzbuzz demo which should be in the same directory as the process demo
    fz::process p;
    if (!p.spawn(get_program_dir(argc, argv) + fzT("timer_fizzbuzz") + suffix)) {
        std::cerr << "Could not spawn process" << std::endl;
        return 1;
    }
    std::cout << "Spawned process" << std::endl;

    // Send a line to the process
    if (!p.write("6\n")) {
        std::cerr << "Sending data to the process failed. Looks like it could not be started or has quit early." << std::endl;
        return 1;
    }

    std::cout << "Waiting on process to print woof..." << std::endl;


    // We don't want to do anything else while waiting, so we don't need a thread to receive data asynchronously
    std::string input;
    bool done = false;
    while (!done) {
        char buf[100];
        int r = p.read(buf, 100);
        if (!r) {
            std::cerr << "Unexpected EOF from process" << std::endl;
            return 1;
        }
        else if (r < 0) {
            std::cerr << "Could not read from process" << std::endl;
            return 1;
        }

        input += std::string(buf, r);

        // Extract complete lines from the input
        auto delim = input.find_first_of("\r\n");
        while (delim != std::string::npos) {
            std::string line = input.substr(0, delim);
            input = input.substr(delim + 1);
            delim = input.find_first_of("\r\n");

            if (!line.empty()) {
                std::cout << "Received line from process: " << line << std::endl;
                if (line == "woof") {
                    done = true;
                }
            }
        }
    }

    // Send a line to the process
    if (!p.write("0\n")) {
        std::cerr << "Sending data to the process failed. Looks like it could not be started or has quit early." << std::endl;
        return 1;
    }

    std::cout << "Told process to quit." << std::endl;

    while (true) {
        char buf[100];
        int r = p.read(buf, 100);
        if (!r) {
            std::cerr << "Received the expected EOF from process" << std::endl;
            break;
        }
        else if (r < 0) {
            std::cerr << "Could not read from process" << std::endl;
            return 1;
        }
    }

    return 0;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines