[pyar] os.dup(), threads y os.read()

Marcos Dione mdione en grulic.org.ar
Mar Dic 1 19:59:42 ART 2015


    tengo el siguiente código en py3.5 (no he probado en otro):

--- 8< ---
In [2]: import threading

In [4]: import os

In [5]: f= os.dup (0)

In [12]: def foo (f):                                
    while True:
        d= os.read (f, 1024)
        if not d:
            break

In [13]: t= threading.Thread (target=foo, args=(f, ))

In [14]: t.start ()                                

# lo siguiente cuesta mucho tipear porque el thread se chorea casi todos los caracteres :) 
In [15]: os.close(f)

# acá aprieto enter y pasa esto:
In [16]: Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python3.4/threading.py", line 911, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.4/threading.py", line 859, in run
    self._target(*self._args, **self._kwargs)
  File "<ipython-input-12-94b37b63f852>", line 3, in foo
    d= os.read (f, 1024)
OSError: [Errno 9] Bad file descriptor
--- >8 ---

    o sea, el os.dup() me devuelva un fd que apunta al mismo file que 0
(stdin, por si no se dieron cuenta). lo que parece pasar es que os.read()
blockea esperando data, y cuando cierro el fd, *no pasa nada*. lo que yo
esperaría es que el read() del loop vea el EOF y devuelva ''. es muy
delirante pedir eso? sino, es un bug? si lo es, muy probablemente sea un
bug en el kernel, pero no me he sentado a ver aún.

-- 
(Not so) Random fortune:
14:01 < Chipaca> e-squizo: yo sé, y vos sabés, que con los dedos podés contar hasta 1024
14:02 < Chipaca> o 1023 si empezás en 0 :)
14:03 < Chipaca> o 59049 si tenés buen control de una falange
14:03 < Chipaca> o 1048576 si tenés buen control de *dos* falanges
14:03 < Chipaca> o 1099511627776 si tenés buen control de dos falanges en manos y pies y usás sandalias


More information about the pyar mailing list