Issue: Reading from stdin in Cywin64 Terminal (first noticed with Git Bash) with a .Net framework application hangs after some time
Takashi Yano
takashi.yano@nifty.ne.jp
Fri Mar 5 09:01:16 GMT 2021
On Wed, 3 Mar 2021 16:11:30 +0100
Nitro Vent wrote:
> I have two .Net console applications targeting .Net Framework 4.7.2,
> "produce.exe" and "consume.exe" with their respective sources
>
> using System;using System.Threading;
> namespace Produce
> {
> class Program
> {
> static void Main(string[] args)
> {
> Thread.Sleep(100);
> Console.WriteLine("Hello World.");
> }
> }
> }
>
> and
>
> using System;
> namespace Consume
> {
> class Program
> {
> static void Main(string[] args)
> {
> var input = Console.In.ReadToEnd();
> Console.WriteLine(input);
> }
> }
> }
>
> Running
>
> $ ./produce.exe | ./consume.exe
>
> in Cygwin Terminal I expect the output to be
>
> Hello World.
>
> But there is no output and the second process, consume.exe, hangs at
> ReadToEnd().
> This was verified by looking at the running processes with ps aux when
> running the consume.exe in the background as well as by attaching the
> Visual Studio debugger.
>
> Piping produce.exe into cat works correctly.
> Piping some more content into consume.exe also fails (e.g. find * /usr |
> consume)
> Executing the same command in Windows Command works correctly.
>
> Notice that piping into consume.exe works if there is no delay in the
> producer.
I looked into this problem and found it seems that the problem
is due to the pipe mode. Cygwin pipe is set FILE_FLAG_OVERLAPPED
and PIPE_TYPE_MESSAGE (by default). According to my test, this
test case works only if the pipe between produce.exe and consume.exe
is PIPE_TYPE_BYTE and not FILE_FLAG_OVERLAPPED set.
I am not sure how the issue can be fixed.
--
Takashi Yano <takashi.yano@nifty.ne.jp>
More information about the Cygwin
mailing list