maybe it's a problem with eof detection. I tried to reproduce it using a threaded version (see attached), but it works correctly. On Fri, Mar 31, 2017 at 5:29 PM arisawa 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 > #include > > 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 === >