Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!nntp.coast.net!howland.erols.net!EU.net!usenet2.news.uk.psi.net!uknet!usenet1.news.uk.psi.net!uknet!dispatch.news.demon.net!demon!awfulhak.demon.co.uk!awfulhak.demon.co.uk!awfulhak.demon.co.uk!not-for-mail From: brian@awfulhak.demon.co.uk (Brian Somers) Newsgroups: comp.unix.bsd.freebsd.misc Subject: Re: Blocking with pipes. Date: 30 Sep 1996 21:44:55 +0100 Organization: Coverform Ltd. Lines: 44 Message-ID: <52pbg7$mg@anorak.coverform.lan> References: <52k448$sjj@herald.concentric.net> NNTP-Posting-Host: localhost.coverform.lan X-NNTP-Posting-Host: awfulhak.demon.co.uk X-Newsreader: TIN [version 1.2 PL2] Andrew Verba (averba@eden.rutgers.edu) wrote: : In a program that I am trying to write, I have : switch(fork()) { : case 0: : dup2(fd[1],STDOUT_FILENO); : dup2(fd[0],STDIN_FILENO); : close(fd[1]); : close(fd[0]); : execvp(argv[0],argv); : perror("BLA"); : exit(0); : default: : write(fd[1],buffer,counter); : close(fd[1]); : : while(read(fd[0],string,50) > 0 ) { : do something with string; : } : close(fd[0]); : break; : } : Why does this read some of the input from the executing file and then : hang (block) ? What does the executing program do ? You've set up a scenario where the above program writes "buffer" to the pipe, then reads it again ! At the same time, you've got argv[0] running - also potentially both reading and writing from/to the same pipe. When you run this sort of thing, the first line the above "read" sees is whatever buffer contains - it's read back immediately. If you're lucky however, your "executed program" may manage to read it first - or even write something first so that the above read can read that something before seeing "buffer" - or maybe it'll never see "buffer" 'cos argv[0] gets it.... The scenario is silly - it's just a pile of race conditions. -- Brian <brian@awfulhak.demon.co.uk> Don't _EVER_ lose your sense of humour....