From owner-freebsd-current Thu Dec 10 05:46:50 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id FAA22593 for freebsd-current-outgoing; Thu, 10 Dec 1998 05:46:50 -0800 (PST) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from boco.fee.vutbr.cz (boco.fee.vutbr.cz [147.229.9.11]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id FAA22587 for ; Thu, 10 Dec 1998 05:46:45 -0800 (PST) (envelope-from cejkar@dcse.fee.vutbr.cz) Received: from kazi.dcse.fee.vutbr.cz (kazi.dcse.fee.vutbr.cz [147.229.8.12]) by boco.fee.vutbr.cz (8.9.1/8.9.1) with ESMTP id OAA46535 for ; Thu, 10 Dec 1998 14:46:35 +0100 (CET) Received: (from cejkar@localhost) by kazi.dcse.fee.vutbr.cz (8.8.8/8.8.8) id OAA12755 for freebsd-current@freebsd.org; Thu, 10 Dec 1998 14:46:35 +0100 (CET) From: Cejka Rudolf Message-Id: <199812101346.OAA12755@kazi.dcse.fee.vutbr.cz> Subject: mkfifo()/select() & O_RDONLY serious bug? To: freebsd-current@FreeBSD.ORG (freebsd-current@freebsd.org) Date: Thu, 10 Dec 1998 14:46:35 +0100 (CET) X-Mailer: ELM [version 2.4ME+ PL31 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG I have prepared small testing program (listed at the end) with mkfifo() and select() calls. Fifo is opened as O_RDONLY or O_RDWR with O_NONBLOCK. On FreeBSD 3.0-CURRENT, its behavior is different from other systems. I think it is serious bug: select() returns that there is ready file descriptor but descriptor is not ready in fact. I'm right? Tested on systems: FreeBSD 3.0-CURRENT FreeBSD 2.2.7 Solaris 2.6 Unixware 2.1 Linux Debian 2.0 { Another bug: On FreeBSD systems I must use "#include " for FD_ZERO() because of bzero() function. Yes? (If not, we need to fix manual page for select(2) about needed includes.) } Results with "#define MODE O_RDWR": (It looks well.) test: Open... test: FD = 3 test: Read... test: read(tst.pipe): Resource temporarily unavailable test: Select... test: select(): Not ready # After timeout Results with "#define MODE O_RDONLY": (It looks bad for -current.) test: Open... test: FD = 3 test: Read... # Next line is only on FreeBSD 2.2.7: (So is it bug on FreeBSD 2.2.7?) test: read(tst.pipe): Resource temporarily unavailable test: Select... # *** Next line on all systems except FreeBSD 3.0-CURRENT: test: select(): Not ready # After timeout # *** This line is only on FreeBSD 3.0-CURRENT: # *** I think, this is next bug, because nothing is ready! test: select(): Ready 3 # *** Immediate return === test.c listing: =============================================== #define MODE O_RDONLY /* O_RDWR */ #include #include #include #include #include #include #include /* Why I need this line on _only_ FreeBSD systems? */ #include #define FILE "tst.pipe" int main(void) { fd_set set; struct timeval t; int fd; int ret; char c; unlink(FILE); if (mkfifo(FILE, S_IRUSR | S_IWUSR) != 0) err(1, "mkfifo(%s)", FILE); warnx("Open..."); if ((fd = open(FILE, MODE | O_NONBLOCK)) < 0) err(1, "open(%s)", FILE); warnx("FD = %d", fd); warnx("Read..."); if (read(fd, &c, 1) < 0) warn("read(%s)", FILE); warnx("Select..."); FD_ZERO(&set); FD_SET(fd, &set); t.tv_sec = 5; t.tv_usec = 0; ret = select(fd + 1, &set, NULL, NULL, &t); if (ret < 0) err(1, "select(%s)", FILE); else if (ret == 0) warnx("select(): Not ready"); else { if (FD_ISSET(fd, &set)) warnx("select(): Ready %d", fd); else warnx("select(): Ready unknown"); } close(fd); return 0; } =================================================================== --=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- Rudolf Cejka (cejkar@dcse.fee.vutbr.cz; http://www.fee.vutbr.cz/~cejkar) Technical University of Brno, Faculty of El. Engineering and Comp. Science Bozetechova 2, 612 66 Brno, Czech Republic To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message