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