Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751352Ab1FRRGV (ORCPT ); Sat, 18 Jun 2011 13:06:21 -0400 Received: from mail-qw0-f46.google.com ([209.85.216.46]:44325 "EHLO mail-qw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750844Ab1FRRGU (ORCPT ); Sat, 18 Jun 2011 13:06:20 -0400 MIME-Version: 1.0 Date: Sat, 18 Jun 2011 10:06:18 -0700 Message-ID: Subject: Does Linux select() violate POSIX? From: Nemo Publius To: linux-kernel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1602 Lines: 43 Suppose I have a file descriptor referencing a TCP/IP socket in blocking mode. Suppose select() reports that the descriptor is ready for reading. If I then call recv() on that descriptor, can it _ever_ block? According to the Linux select man page (http://linux.die.net/man/2/select), the answer is yes: "Under Linux, select() may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready." According to the POSIX specification for select (http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html), the answer is no: "A descriptor shall be considered ready for reading when a call to an input function with O_NONBLOCK clear would not block, whether or not the function would transfer data successfully. (The function might return data, an end-of-file indication, or an error other than one indicating that it is blocked, and in each of these cases the descriptor shall be considered ready for reading.)" There are only three possibilities: 1) I am mis-reading the POSIX spec. 2) The Linux select() man page is wrong. 3) Linux select() violates the POSIX spec. So, which is it? Thanks! -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/