[pyar] clonar un pipe

Luciano Bello lbello en gmail.com
Mar Oct 12 15:04:10 ART 2010


2010/10/11 Alejandro Santos <listas en alejolp.com>:
> Ah, ahora es diferente. Suponiendo que no hubo fork(), que no hay otro
> proceso intentando escribir en w1, y que r1 tiene datos dentro,
> clone_pipe puede llegar a ser algo como:
>
> def clone_pipe(r1, w1):
>  (r2,w2,) = os.pipe()
>  initial = os.read(r1, 2**16)
>  os.write(w1, initial)
>  os.write(w2, initial)
>  return (r2, w2,)
>
> No lo probé y seguro se me escapó algo, pero me imagino que deberia
> venir por ese lado. Si r1 no tiene nada dentro hay deadlock, habria
> que setear el flag de non-blocking o usar select (suponiendo que no
> estas en Windows).

Muchas gracias por tu sugerencia. Una versión testeada:
def clone_pipe(r1,w1):
  (r2,w2)=os.pipe()
  data=''
  while True:
    try:
        data+=os.read(r1,2**16)
    except: break
  os.write(w1, data)
  os.write(w2, data)
  return (r2,w2)

clone_pipe tiene que correr mutex con el write, cosa que se da en mi
código grande.
El while es en caso de que esté extendido el PIPE_BUFFERS. Parece
hacer lo que quiero. Y parece hacerlo lo suficientemente rápido. No
estoy seguro si es del todo óptimo, pero funciona de momento.

Gracias a todos los que aportaron al hilo. Han sido muy amables...

saludos, luciano



More information about the pyar mailing list