ITADN

Windows subprocess_stdin and subprocess_option_enable_async?

#74Closedg40 创建于 2023-07-05
G
g40commented
Hello. A question: For a complete ready to bake example see final code block. Short story, using the handle returned from `subprocess_stdin(&process);`, a call like `int ret = fputs(text.c_str(), p_stdin);` always returns 0, as does the subsequent `subprocess_read_stdout()`. Any thoughts on this? Have I missed something in the documentation? And a suggestion: `subprocess_read_stdout()` blocks. On Windows, at least, it can be made non-blocking by changing the last argument to 0. Might this not be made an optional argument? Many thanks. ``` // Means we've got an async read! if (error == errorIoPending) { if (!GetOverlappedResult(handle, SUBPROCESS_PTR_CAST(LPOVERLAPPED, &overlapped), &bytes_read, 0)) { // changed from 1 (wait) to 0 (don't wait) const unsigned long errorIoIncomplete = 996; const unsigned long errorHandleEOF = 38; error = GetLastError(); ``` Built with `cl main.cpp` in a VS2022 command shell. ``` #include <iostream> #include <sstream> #include "subprocess.h" int main(int argc,char* argv[]) { int ret = -1; try { struct subprocess_s process { 0 }; // run a basic shell //const char* command_line[] = { "cmd.exe", "/K", nullptr}; //const char* command_line[] = { "cmd.exe", "/K r:\\apps\\mingw\\msys\\1.0\\bin\\ls.exe -als", nullptr}; const char* command_line[] = { "cmd.exe", "/K ls.exe -als", nullptr}; // this correctly says ls.exe cannot be found so is alive //const char* command_line[] = { "cmd.exe", "/K", "echo %path%", nullptr }; int result = subprocess_create(command_line, subprocess_option_combined_stdout_stderr | subprocess_option_no_window | subprocess_option_enable_async, &process); if (0 != result) { // an error occurred! } // hack for the moment. _sleep(1000); char buffer[255]; int chars = 0; do { // modified to NOT block chars = subprocess_read_stdout(&process, buffer, 254); if (chars) { buffer[chars] = '\0'; std::cout << buffer; } } while (chars > 0); while (true) { std::string text; std::getline(std::cin, text); FILE* p_stdin = subprocess_stdin(&process); int ret = fputs(text.c_str(), p_stdin); std::cout << "Wrote " << ret << std::endl; if (ret) { do { chars = subprocess_read_stdout(&process, buffer, 254); if (chars) { buffer[chars] = '\0'; std::cout << buffer; } } while (chars > 0); } } // result = subprocess_destroy(&process); if (0 != result) { // an error occurred! } ret = 0; } catch (std::exception& ex) { std::cout << "exception: " << ex.what(); } catch (...) { std::cout << "unknown exception."; } return ret; } ```
关闭于 2023-07-07 1 条评论