[issue15896] Sporadic EINVAL in nonblocking pipe os.read when forked child fails on Mac OS

Vitaly report at bugs.python.org
Wed Sep 19 19:54:42 CEST 2012


Vitaly added the comment:

> And what kind of workaround do you propose?

[os.read(fd, buffersize)]

I am thinking about these options:

Option 1:
Fix breakages as they are discovered at higher level (above os.read) as needed in places where usage semantics are known, and address the issue via errata documentation (i.e., "On Mac OS X, don't make individual pipe read requests that would result in os.read() buffersize arg being above 127KB on non-blocking pipes."); should also check if the same issue occurs with sockets (e.g., socket.socketpair() instead of os.pipe()) to make the errata more complete.  This may be perfectly acceptable and how things have worked for a long time.

Option 2:
Implement a work-around in the lowest common denominator wrapper function, so that anything in Python that needs to call read() and could benefit from this work-around, would call that wrapper instead of read().  The read() work-around might go something like this in *pseudocode*:


if running_on_darwin and buffersize > 127KB:
    # fix up buffer size to work around a Mac OS x bug...
    if stat.S_ISFIFO(os.fstat(fd).st_mode):
        buffersize = 127KB

Then do whatever else the read function is supposed to do.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue15896>
_______________________________________


More information about the Python-bugs-list mailing list