good catch! the behavior makes sense now.

On Sun, Apr 2, 2017 at 5:34 AM Antons Suspans <[email protected]> wrote:

> This was writing a \0 just past end of buf[], into memory alloted for
> pfd[0].
> See the explanation by Alex in the 9front list:
> /n/9front.org/lists/9front/1490668028.00
>
> On Sun, Apr 02, 2017 at 07:34:52AM +0000, Skip Tavakkolian wrote:
> > this is either a bug in devpipe or the documentation is misleading. the
> man
> > page seems to say that the pair of fd's returned by pipe(2) are
> symmetrical,
> > but it matters which fd of the pair is used for writing.  if you switch
> around
> > pfd[0] and pfd[1], it works as you'd expect.
> >
> > On Fri, Mar 31, 2017 at 5:29 PM arisawa <[email protected]> wrote:
> >
> >   Hello,
> >
> >   I was playing with an experimental code on pipe and met with a problem
> which
> >   I don’t understand.
> >
> >   the program reads a file and writes it to one end of pipe and then
> reads it
> >   from another end of pipe.
> >   the buffer for writing pipe is named buf0, and for reading pipe is
> named buf.
> >   and I found the program does not finish unless sizeof(buf) >
> sizeof(buf0).
> >   is this a bug or feature of pipe?
> >
> >   Kenji Arisawa
> >
> >   === BEGIN a.c ===
> >   #include <u.h>
> >   #include <libc.h>
> >
> >   char *argv0;
> >
> >   void
> >   usage(void)
> >   {
> >           fprint(2,"usage: %s file\n",argv0);
> >           exits("usage");
> >   }
> >
> >   void
> >   main(int argc, char *argv[])
> >   {
> >           int fd,pfd[2];
> >           char buf[256];
> >           char buf0[256];
> >           /* need to be sizeof(buf) > sizeof(buf0)
> >            * but this condition is very curious to me */
> >           int n;
> >           char *file;
> >           argv0 = argv[0];
> >           argc--;argv++;
> >           USED(argc);
> >           if(argv[0] == nil)
> >                   usage();
> >           file = argv[0];
> >           fd = open(file,OREAD);
> >           if(fd < 0)
> >                   sysfatal("no such file");
> >
> >           if(pipe(pfd) < 0)
> >                   sysfatal("pipe error");
> >           print("pfd: %d %d\n",pfd[0],pfd[1]);
> >
> >           while((n = read(fd,buf0,sizeof(buf0))) > 0){
> >                   print("read: %d %s\n",n,file);
> >                   n = write(pfd[1],buf0,n);
> >                   print("write: %d\n",n);
> >           }
> >           close(pfd[1]);
> >           while((n = read(pfd[0],buf,sizeof(buf))) > 0){
> >                   buf[n] = 0;
> >                   print("%d %s\n",n,buf);
> >           }
> >           print("%d\n",n);
> >
> >           exits(nil);
> >   }
> >   === END a.c ===
> >
>
>

Reply via email to