On Fri, 13 Mar 2020 20:26:43 +0300 Greg Minshall <minsh...@umich.edu> wrote:
> my sense from pipe and looking at the sources (sys-unix.c) is that is > not possible. is that true? are there any thoughts of providing > such a facility? Pipes (including those created by popen(3), which R pipe() uses internally) are uni-directional data channels. While it could be possible to open two pipes for both stdin and stdout of the child process, doing so correctly is complicated because of differences in buffering provided by the runtime: when stdin/stdout is not a terminal, buffering mode may be set to block-oriented instead of line-oriented, resulting in both parent and child being dead-locked, waiting to fill the buffer instead of returning from the blocking call after the first newline. (Hence the -l flag to sed mentioned by Gábor Csárdi, which avoids this problem for sed). Programs designed to first read stdin until end-of-file, then process the input and print results on the stdout are usually safe to use in this way, but others may be not. Software specifically designed to control other software (e.g. Expect [*]) gets around this limitation by running the child processes inside pseudo-terminals and/or running in event-driven manner, being ready to service the child process whether it wants to read its stdin or write to stdout. Since sed has its -l flag, it should be possible to safely drive it line-by-line with the help of processx, but not via pipe(). -- Best regards, Ivan [*] https://core.tcl-lang.org/expect/index ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel