Date: Thu, 8 Jun 2023 23:35:52 -0400 From: Aryeh Friedman <aryeh.friedman@gmail.com> To: Paul Procacci <pprocacci@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: <CAGBxaXkF2AwM8oXwDwWWkiaBO_Kpe-QAxXi9HekEuQLkqY3Bwg@mail.gmail.com> In-Reply-To: <CAFbbPugCnZWvPXCmicmNP_Z0e3xhxqESNSFeSLM-HAxBn913Kw@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> <CAFbbPugCnZWvPXCmicmNP_Z0e3xhxqESNSFeSLM-HAxBn913Kw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jun 8, 2023 at 11:23=E2=80=AFPM Paul Procacci <pprocacci@gmail.com>= wrote: > > > > On Thu, Jun 8, 2023 at 10:55=E2=80=AFPM Aryeh Friedman <aryeh.friedman@gm= ail.com> wrote: >> >> On Thu, Jun 8, 2023 at 10:32=E2=80=AFPM Paul Procacci <pprocacci@gmail.c= om> wrote: >> > >> > >> > >> > 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@g= mx.at> 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.kle= pp@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 h= ard 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=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 ret= urn >> >> > > >> >> > >> >> > Your console is linebuffered, so "cat" receives lines. IIRC "cat" d= isables 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 adve= rtised: >> >> >> >> 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) ar= en'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 term= ios(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 =3D read(0,&ch,1); > if(!r) break; > write(1, &ch, 1); > } > _exit(0); > } Please see the whole context the goal is to make it so I can type at the command line into a java program and have instantaneous presentation of any characters I enter to Java --=20 Aryeh M. Friedman, Lead Developer, http://www.PetiteCloud.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGBxaXkF2AwM8oXwDwWWkiaBO_Kpe-QAxXi9HekEuQLkqY3Bwg>