X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL,BAYES_40 X-Spam-Check-By: sourceware.org Message-ID: <4C3E59E3.4050003@hones.org.uk> Date: Thu, 15 Jul 2010 01:44:19 +0100 From: Cliff Hones User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Problem with select() on console Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Spam-Score: -0.0 (/) (dominator.watchfront.net.uk) X-Spam-Report: dominator.watchfront.net.uk has scanned this email for spam. Results:- T_RP_MATCHES_RCVD=-0.01 (total -0.0, current threshold 4.0) X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com When select() is used to test for input availability on the standard cygwin console in normal (cooked) mode, it indicates input is available as soon as any key is pressed. However, a call to read(0,...) will (correctly) block until a terminating RETURN is entered. select() should only indicate input is available when a call to read would *not* block - ie when a read call will immediately return at least one character or an error such as EOF. The behaviour of the following test case illustrates this. When run in a console window typing a single key causes the program to wait for the whole line. When run under mintty or on Linux the select() calls will continue to return no input until RETURN is entered. #include #include #include #include #include #include #include #include #include #include #include int main(void) { fd_set rs; struct timeval tv; char buff[100]; while (1) { sleep(1); printf("Calling select\n"); FD_ZERO(&rs); FD_SET(0, &rs); tv.tv_sec = tv.tv_usec = 0; int k = select(1, &rs, NULL, NULL, &tv); if (k < 0) perror("Error calling select"); else if (FD_ISSET(0, &rs)) { printf("Input available\n"); int n = read(0, buff, sizeof(buff)); printf("read returned %d\n", n); } } return 0; } -- Cliff -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple