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