randy@retix.retix.COM (Miyazaki Randy) (03/24/89)
Why does the child read not terminate with a End of File indication ?
Bizzarely enough, the program hangs both under BSD 4.3 and
S5R3 (Interactive VP/IX 1.0.6). This seems to contradict any
documentation on pipes I have seen.
int pipefd[2];
char buf;
main()
{
int len;
if (pipe(pipefd) < 0)
{
perror("pipe");
exit(1);
}
if (fork())
{
/* Parent process here */
printf("reading...\n");
len = read(pipefd[0], &buf, 1);
printf("child read return %d\n", len);
if (len < 0)
perror("read");
exit(0);
}
sleep(2);
printf("child process exiting, parent read should return EOF\n");
exit(0);
}kucharsk@uts.amdahl.com (William Kucharski) (03/25/89)
In article <407@retix.retix.COM> randy@retix.retix.com.UUCP (Miyazaki Randy) writes: >Why does the child read not terminate with a End of File indication ? >Bizzarely enough, the program hangs both under BSD 4.3 and >S5R3 (Interactive VP/IX 1.0.6). This seems to contradict any >documentation on pipes I have seen. > Although it's not mentioned in the man page, you should close the file descriptor you are _not_ using on your end of the pipe (i.e., if you are the parent, close pipefd[1]; if you're the child, close pipefd[0].) If you change your code from > len = read(pipefd[0], &buf, 1); to close(pipefd[1]); len = read(pipefd[0], &buf, 1); it does work... -- William Kucharski ARPA: kucharsk@uts.amdahl.com UUCP: ...!{ames,decwrl,sun,uunet}!amdahl!kucharsk Disclaimer: The opinions expressed above are my own, and may not agree with those of any other sentient being, not to mention those of my employer. So there.