Date: Mon, 26 Feb 2001 18:40:36 -0800 From: Dima Dorfman <dima@unixfreak.org> To: Marc W <mwlist@lanfear.com> Cc: freebsd-hackers@freebsd.org Subject: Re: Why does a named pipe (FIFO) give me my data twice ??? Message-ID: <20010227024036.46EB03E09@bazooka.unixfreak.org> In-Reply-To: Message from Marc W <mwlist@lanfear.com> of "Mon, 26 Feb 2001 12:58:36 PST." <200102262058.MAA39013@akira.lanfear.com>
next in thread | previous in thread | raw e-mail | index | archive | help
If the first program calls open(2) before the second one calls close(2) the former will not block because there's already a writer on the pipe. A possible workaround would be to unlink and recreate the fifo in program one, like so: for (;;) { int fifo; mkfifo(fifo_path, fifo_mode); fifo = open(fifo_path, O_RDONLY); read(fifo, ...); printf(...); close(fifo); unlink(fifo_path); } As for why this actually happens, I don't know. None of my Stevens books explain this. Hope this helps Dima Dorfman dima@unixfreak.org > > hello! > > I've got a program that creates a named pipe, and then spawns a > thread > which sits in a loop: > > // error checking snipped. > // > while (1) { > int fifo = open(fifoPath, O_RDONLY); // this blocks > fprintf(stderr, "somebody opened the other end!\n"); > read(fifo, buf, sizeof(buf)); > fprintf(stderr, "got the following data: %s\n", buf); > close(fifo); > } > > i then have another instance of the same program do the following: > > fifo = open(fifoPath, O_WRONLY); > write(fifo, buf, strlen(buf); > > > now, the problem is that the first process succeeds suddenly for > the > open, reads the data, closes the fifo, and IMMEDIATELY SUCCEEDS THE > open(2) > again, reading in the same data. > After that, all is as expected. > > Note that this doesn't happen ALL the time -- only about 80% of the > time. > > Any idea why this would happen? To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010227024036.46EB03E09>