Date: Thu, 8 Jun 2023 23:23:11 -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, freebsd-java@freebsd.org Subject: Re: Slightly OT: non-buffered stdin in Java Message-ID: <CAFbbPugCnZWvPXCmicmNP_Z0e3xhxqESNSFeSLM-HAxBn913Kw@mail.gmail.com> In-Reply-To: <CAGBxaXm6hP9YUCtbV2Cumvn=LWy7TgYctLA-tZU=GSrP8hg9Jw@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> <CAFbbPuhvy=rtBU0iSJzyrxWdPYamXeFcGdBkUPYEvkLt46UyBA@mail.gmail.com> <CAGBxaXm6hP9YUCtbV2Cumvn=LWy7TgYctLA-tZU=GSrP8hg9Jw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] On Thu, Jun 8, 2023 at 10:55 PM Aryeh Friedman <aryeh.friedman@gmail.com> wrote: > On Thu, Jun 8, 2023 at 10:32 PM Paul Procacci <pprocacci@gmail.com> wrote: > > > > > > > > On Thu, Jun 8, 2023 at 9:22 PM Aryeh Friedman <aryeh.friedman@gmail.com> > wrote: > >> > >> On Thu, Jun 8, 2023 at 6:37 PM Dr. Nikolaus Klepp <dr.klepp@gmx.at> > wrote: > >> > > >> > Anno domini 2023 Thu, 8 Jun 17:22:38 -0400 > >> > Aryeh Friedman scripsit: > >> > > On Thu, Jun 8, 2023 at 2:39 PM Dr. Nikolaus Klepp <dr.klepp@gmx.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 > was > >> > > > > 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 > file > >> > > > > version of stdin > >> > > > > > >> > > > > >> > > > "stdbuf" might be what you look for: > >> > > > > >> > > > https://man.freebsd.org/cgi/man.cgi?query=stdbuf > >> > > > >> > > 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 for > 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=fcntl(STDIN_FILENO, F_DUPFD, 0); > >> int out=fcntl(STDOUT_FILENO, F_DUPFD, 0); > >> char c=0; > >> > >> do { > >> read(in,&c,1); > >> write(out,&c,1); > >> } while(c!=EOF); > >> } > >> 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. > > I also tried it with System.in.read() in Java and it was also buffered > but according to the openjdk source it appears that this is on > purpose. > > > > -- > Aryeh M. Friedman, Lead Developer, http://www.PetiteCloud.org > When you just `./a.out` you're being bitten by the tty. You can manipulate that terminal to do what you want. Start reading termios(4). Without a tty you will only get a character at a time with the following: #include <unistd.h> int main(int argc, char **argv) { char ch; for(;;){ ssize_t r = read(0,&ch,1); if(!r) break; write(1, &ch, 1); } _exit(0); } __________________ :(){ :|:& };: [-- Attachment #2 --] <div dir="ltr"><div><div><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 8, 2023 at 10:55 PM Aryeh Friedman <<a href="mailto:aryeh.friedman@gmail.com">aryeh.friedman@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Thu, Jun 8, 2023 at 10:32 PM Paul Procacci <<a href="mailto:pprocacci@gmail.com" target="_blank">pprocacci@gmail.com</a>> wrote:<br> ><br> ><br> ><br> > On Thu, Jun 8, 2023 at 9:22 PM Aryeh Friedman <<a href="mailto:aryeh.friedman@gmail.com" target="_blank">aryeh.friedman@gmail.com</a>> wrote:<br> >><br> >> On Thu, Jun 8, 2023 at 6:37 PM Dr. Nikolaus Klepp <<a href="mailto:dr.klepp@gmx.at" target="_blank">dr.klepp@gmx.at</a>> wrote:<br> >> ><br> >> > Anno domini 2023 Thu, 8 Jun 17:22:38 -0400<br> >> > Aryeh Friedman scripsit:<br> >> > > On Thu, Jun 8, 2023 at 2:39 PM Dr. Nikolaus Klepp <<a href="mailto:dr.klepp@gmx.at" target="_blank">dr.klepp@gmx.at</a>> wrote:<br> >> > > ><br> >> > > > Anno domini 2023 Thu, 8 Jun 14:01:19 -0400<br> >> > > > Aryeh Friedman scripsit:<br> >> > > > > Under Java stdin (System.in) is a buffered stream not sent to the<br> >> > > > > application until return is pressed. But, Java can read from<br> >> > > > > files/sockets and other generic InputStreams unbuffered. So I was<br> >> > > > > wondering if there is a command that will make stdin go to a file so<br> >> > > > > that Java can open that file and read it unbuffered?<br> >> > > > ><br> >> > > > > I know I can do something like cat ->file but that makes it hard to<br> >> > > > > sync stdout and stderr (both are unbuffered in Java) with the file<br> >> > > > > version of stdin<br> >> > > > ><br> >> > > ><br> >> > > > "stdbuf" might be what you look for:<br> >> > > ><br> >> > > > <a href="https://man.freebsd.org/cgi/man.cgi?query=stdbuf" rel="noreferrer" target="_blank">https://man.freebsd.org/cgi/man.cgi?query=stdbuf</a><br> >> > ><br> >> > > Will likely need to play with it more but stdbuf -i 0 -o 0 cat -|cat<br> >> > > didn't produce the expected immediate echo I still had to hit return<br> >> > ><br> >> ><br> >> > Your console is linebuffered, so "cat" receives lines. IIRC "cat" disables linebuffer on input by itself, so you should use someting else for testing.<br> >> ><br> >> > Nik<br> >> ><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 <stdio.h><br> >> #include <fcntl.h><br> >> #include <unistd.h><br> >><br> >> int main()<br> >> {<br> >> int in=fcntl(STDIN_FILENO, F_DUPFD, 0);<br> >> int out=fcntl(STDOUT_FILENO, F_DUPFD, 0);<br> >> char c=0;<br> >><br> >> do {<br> >> read(in,&c,1);<br> >> write(out,&c,1);<br> >> } while(c!=EOF);<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="http://www.PetiteCloud.org" rel="noreferrer" target="_blank">http://www.PetiteCloud.org</a><br> >><br> ><br> > stdbuf only works for stdio buffering of which read(2) and write(2) aren't.<br> <br> I also tried it with System.in.read() in Java and it was also buffered<br> but according to the openjdk source it appears that this is on<br> purpose.<br> <br> <br> <br> -- <br> Aryeh M. Friedman, Lead Developer, <a href="http://www.PetiteCloud.org" rel="noreferrer" target="_blank">http://www.PetiteCloud.org</a><br> </blockquote></div><br><br clear="all"></div>When you just `./a.out` you're being bitten by the tty.<br></div><div>You can manipulate that terminal to do what you want. Start reading termios(4).</div><div><br></div><div>Without a tty you will only get a character at a time with the following:<br></div><div><br>#include <unistd.h><br><br>int main(int argc, char **argv)<br>{<br> char ch;<br> for(;;){<br> ssize_t r = read(0,&ch,1);<br> if(!r) break;<br> write(1, &ch, 1);<br> }<br> _exit(0);<br>}<br><br><br></div><div><div><div><div dir="ltr" class="gmail_signature">__________________<br><br>:(){ :|:& };:</div></div></div></div></div>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFbbPugCnZWvPXCmicmNP_Z0e3xhxqESNSFeSLM-HAxBn913Kw>
