From owner-freebsd-arch Tue Sep 10 13: 3:47 2002 Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CBB4537B400 for ; Tue, 10 Sep 2002 13:03:44 -0700 (PDT) Received: from thunderer.cnchost.com (thunderer.concentric.net [207.155.252.72]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3373D43E3B for ; Tue, 10 Sep 2002 13:03:44 -0700 (PDT) (envelope-from bakul@bitblocks.com) Received: from bitblocks.com (adsl-209-204-185-216.sonic.net [209.204.185.216]) by thunderer.cnchost.com id QAA28365; Tue, 10 Sep 2002 16:03:40 -0400 (EDT) [ConcentricHost SMTP Relay 1.14] Message-ID: <200209102003.QAA28365@thunderer.cnchost.com> To: Archie Cobbs Cc: freebsd-arch@FreeBSD.ORG Subject: Re: /dev/stdout behavior In-reply-to: Your message of "Tue, 10 Sep 2002 10:58:02 PDT." <200209101758.g8AHw2C33935@arch20m.dellroad.org> Date: Tue, 10 Sep 2002 13:03:39 -0700 From: Bakul Shah Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG > Bakul Shah writes: > > > For example, if you use fcntl() to set flags on fd 0, and then open > > > /dev/stdout, the new file descriptor you get back will have those > > > same flags set. Run the program below to see an example. This is > > > in agreement with the man page, which states that opening /dev/stdout > > > is equivalent to dup(2)'ing fd 0. > > > > Careful reading of man stdout will reveal that opening > > /dev/stdout is equivalent to dup()ing fd 1, not fd 0. > > Arg, this whole time I meant to use '1' instead of '0'... > > But, hey-- now there's an even bigger bug! As the accidental discoverer of the bug, you should report it! dup(2) says that everything but the close-on-exec flag is shared by the new fd with the old fd. So (except for this bigger bug) the FreeBSD behavior is correct as verified by changing if ((flags = fcntl(0, F_GETFL, 0)) == -1) err(1, "fcntl"); if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1) to if ((flags = fcntl(1, F_GETFL, 0)) == -1) err(1, "fcntl"); if (fcntl(1, F_SETFL, flags | O_NONBLOCK) == -1) You need to fix your test program similarly and run it under Linux to see if the two OSes behave differently. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message