Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Jun 2023 22:32:14 -0400
From:      Paul Procacci <pprocacci@gmail.com>
To:        Aryeh Friedman <aryeh.friedman@gmail.com>
Cc:        "Dr. Nikolaus Klepp" <dr.klepp@gmx.at>, questions@freebsd.org
Subject:   Re: Slightly OT: non-buffered stdin in Java
Message-ID:  <CAFbbPuhvy=rtBU0iSJzyrxWdPYamXeFcGdBkUPYEvkLt46UyBA@mail.gmail.com>
In-Reply-To: <CAGBxaXnVM=P%2B2r4o0UuEnOzhE6S9TTWbXyWFk2XGYqCsCdG44A@mail.gmail.com>
References:  <CAGBxaX=muu6JbMsdZbop7mYa-LetXPHvO8_=kMZtF%2BzSAdiBYA@mail.gmail.com> <202306082039.36831.dr.klepp@gmx.at> <CAGBxaXnq%2BU9C7=Vepc4Poq8LaZCo8DnkPpMH5UT70dUsKrG3bw@mail.gmail.com> <202306090036.42118.dr.klepp@gmx.at> <CAGBxaXnVM=P%2B2r4o0UuEnOzhE6S9TTWbXyWFk2XGYqCsCdG44A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--000000000000f8923f05fda92dec
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Jun 8, 2023 at 9:22=E2=80=AFPM Aryeh Friedman <aryeh.friedman@gmail=
.com>
wrote:

> On Thu, Jun 8, 2023 at 6:37=E2=80=AFPM Dr. Nikolaus Klepp <dr.klepp@gmx.a=
t> wrote:
> >
> > Anno domini 2023 Thu, 8 Jun 17:22:38 -0400
> >  Aryeh Friedman scripsit:
> > > On Thu, Jun 8, 2023 at 2:39=E2=80=AFPM Dr. Nikolaus Klepp <dr.klepp@g=
mx.at>
> wrote:
> > > >
> > > > Anno domini 2023 Thu, 8 Jun 14:01:19 -0400
> > > >  Aryeh Friedman scripsit:
> > > > > Under Java stdin (System.in) is a buffered stream not sent to the
> > > > > application until return is pressed.  But, Java can read from
> > > > > files/sockets and other generic InputStreams unbuffered.   So I w=
as
> > > > > wondering if there is a command that will make stdin go to a file
> so
> > > > > that Java can open that file and read it unbuffered?
> > > > >
> > > > > I know I can do something like cat ->file but that makes it hard =
to
> > > > > sync stdout and stderr (both are unbuffered in Java) with the fil=
e
> > > > > version of stdin
> > > > >
> > > >
> > > > "stdbuf" might be what you look for:
> > > >
> > > > https://man.freebsd.org/cgi/man.cgi?query=3Dstdbuf
> > >
> > > Will likely need to play with it more but stdbuf -i 0 -o 0 cat -|cat
> > > didn't produce the expected immediate echo I still had to hit return
> > >
> >
> > Your console is linebuffered, so "cat" receives lines. IIRC "cat"
> disables linebuffer on input by itself, so you should use someting else f=
or
> testing.
> >
> > Nik
> >
>
> I am pretty convinced by the following test it is not working as
> advertised:
>
> aryehl@neomarx:~/Desktop % cat foo.c
> #include <stdio.h>
> #include <fcntl.h>
> #include <unistd.h>
>
> int main()
> {
>     int in=3Dfcntl(STDIN_FILENO, F_DUPFD, 0);
>     int out=3Dfcntl(STDOUT_FILENO, F_DUPFD, 0);
>     char c=3D0;
>
>     do {
>         read(in,&c,1);
>         write(out,&c,1);
>     } while(c!=3DEOF);
> }
> aryehl@neomarx:~/Desktop % !cc
> cc foo.c
> aryehl@neomarx:~/Desktop % stdbuf -i 0 -o 0 ./a.out
> this is not echoing!
> this is not echoing!
> neither is this
> neither is this
> ^C
> aryehl@neomarx:~/Desktop %
>
> --
> Aryeh M. Friedman, Lead Developer, http://www.PetiteCloud.org
>
>
stdbuf only works for stdio buffering of which read(2) and write(2) aren't.

~Paul

--=20
__________________

:(){ :|:& };:

--000000000000f8923f05fda92dec
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div><div dir=3D"ltr"><br></div><br><div class=3D"gmail_qu=
ote"><div dir=3D"ltr" class=3D"gmail_attr">On Thu, Jun 8, 2023 at 9:22=E2=
=80=AFPM Aryeh Friedman &lt;<a href=3D"mailto:aryeh.friedman@gmail.com">ary=
eh.friedman@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,20=
4);padding-left:1ex">On Thu, Jun 8, 2023 at 6:37=E2=80=AFPM Dr. Nikolaus Kl=
epp &lt;<a href=3D"mailto:dr.klepp@gmx.at" target=3D"_blank">dr.klepp@gmx.a=
t</a>&gt; wrote:<br>
&gt;<br>
&gt; Anno domini 2023 Thu, 8 Jun 17:22:38 -0400<br>
&gt;=C2=A0 Aryeh Friedman scripsit:<br>
&gt; &gt; On Thu, Jun 8, 2023 at 2:39=E2=80=AFPM Dr. Nikolaus Klepp &lt;<a =
href=3D"mailto:dr.klepp@gmx.at" target=3D"_blank">dr.klepp@gmx.at</a>&gt; w=
rote:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Anno domini 2023 Thu, 8 Jun 14:01:19 -0400<br>
&gt; &gt; &gt;=C2=A0 Aryeh Friedman scripsit:<br>
&gt; &gt; &gt; &gt; Under Java stdin (System.in) is a buffered stream not s=
ent to the<br>
&gt; &gt; &gt; &gt; application until return is pressed.=C2=A0 But, Java ca=
n read from<br>
&gt; &gt; &gt; &gt; files/sockets and other generic InputStreams unbuffered=
.=C2=A0 =C2=A0So I was<br>
&gt; &gt; &gt; &gt; wondering if there is a command that will make stdin go=
 to a file so<br>
&gt; &gt; &gt; &gt; that Java can open that file and read it unbuffered?<br=
>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; I know I can do something like cat -&gt;file but that m=
akes it hard to<br>
&gt; &gt; &gt; &gt; sync stdout and stderr (both are unbuffered in Java) wi=
th the file<br>
&gt; &gt; &gt; &gt; version of stdin<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &quot;stdbuf&quot; might be what you look for:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; <a href=3D"https://man.freebsd.org/cgi/man.cgi?query=3Dstdbu=
f" rel=3D"noreferrer" target=3D"_blank">https://man.freebsd.org/cgi/man.cgi=
?query=3Dstdbuf</a><br>
&gt; &gt;<br>
&gt; &gt; Will likely need to play with it more but stdbuf -i 0 -o 0 cat -|=
cat<br>
&gt; &gt; didn&#39;t produce the expected immediate echo I still had to hit=
 return<br>
&gt; &gt;<br>
&gt;<br>
&gt; Your console is linebuffered, so &quot;cat&quot; receives lines. IIRC =
&quot;cat&quot; disables linebuffer on input by itself, so you should use s=
ometing else for testing.<br>
&gt;<br>
&gt; Nik<br>
&gt;<br>
<br>
I am pretty convinced by the following test it is not working as advertised=
:<br>
<br>
aryehl@neomarx:~/Desktop % cat foo.c<br>
#include &lt;stdio.h&gt;<br>
#include &lt;fcntl.h&gt;<br>
#include &lt;unistd.h&gt;<br>
<br>
int main()<br>
{<br>
=C2=A0 =C2=A0 int in=3Dfcntl(STDIN_FILENO, F_DUPFD, 0);<br>
=C2=A0 =C2=A0 int out=3Dfcntl(STDOUT_FILENO, F_DUPFD, 0);<br>
=C2=A0 =C2=A0 char c=3D0;<br>
<br>
=C2=A0 =C2=A0 do {<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 read(in,&amp;c,1);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 write(out,&amp;c,1);<br>
=C2=A0 =C2=A0 } while(c!=3DEOF);<br>
}<br>
aryehl@neomarx:~/Desktop % !cc<br>
cc foo.c<br>
aryehl@neomarx:~/Desktop % stdbuf -i 0 -o 0 ./a.out<br>
this is not echoing!<br>
this is not echoing!<br>
neither is this<br>
neither is this<br>
^C<br>
aryehl@neomarx:~/Desktop %<br>
<br>
-- <br>
Aryeh M. Friedman, Lead Developer, <a href=3D"http://www.PetiteCloud.org" r=
el=3D"noreferrer" target=3D"_blank">http://www.PetiteCloud.org</a><br>;
<br>
</blockquote></div><br>stdbuf only works for stdio buffering of which read(=
2) and write(2) aren&#39;t.<br></div><div><br></div><div>~Paul<br></div><di=
v><br><span class=3D"gmail_signature_prefix">-- </span><br><div dir=3D"ltr"=
 class=3D"gmail_signature">__________________<br><br>:(){ :|:&amp; };:</div=
></div></div>

--000000000000f8923f05fda92dec--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFbbPuhvy=rtBU0iSJzyrxWdPYamXeFcGdBkUPYEvkLt46UyBA>