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