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 <karisawa@gmail.com> 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 ===