Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

319
Vistas
¿Cómo realizo E/S de bajo nivel en un archivo de dispositivo Linux en Python?

Tengo un dispositivo que devuelve una cadena en respuesta a los comandos escritos en el archivo del dispositivo. Puedo escribir comandos en el dispositivo y leer la cadena de retorno en C con un código que se parece a:

 int dev = open("/dev/USBDev251", O_RDWR); write(dev, data, sizeof(data)); read(dev, buff, 16);

Estoy tratando de hacer lo mismo en Python con:

 dev = os.open("/dev/USBDev251", os.O_RDWR) os.write(dev, data) os.read(dev, 16)

La escritura es exitosa, pero solo se devuelve una cadena vacía. ¿Que me estoy perdiendo aqui?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

De acuerdo con la documentación de os.write :

Nota: esta función está diseñada para E/S de bajo nivel y debe aplicarse a un descriptor de archivo como lo devuelve os.open() o pipe() . Para escribir un "objeto de archivo" devuelto por la función incorporada open() o por popen() o fdopen() , o sys.stdout o sys.stderr , use su método write() .

No deberías estar mezclando y combinando aquí. Si usa la función global open() para abrir un archivo, solo debe usar los métodos read() y write() del objeto de archivo. Por el contrario, si usa os.open() para abrir un archivo, solo debe usar os.read() y os.write() .

Entonces, intente reemplazar su llamada a open() con os.open() ; o mantenga la llamada open() y reemplace os.write(dev, ...) con dev.write(...) y reemplace os.read(dev, ...) con dev.read(...) .

over 4 years ago · Santiago Trujillo Denunciar

0

Agregue un os.lseek() para buscar de nuevo al comienzo de la cadena que escribió. Actualmente escribiste 16 bytes que avanzaron el puntero. Cuando lee, comienza a leer en el puntero actual, por lo que debe retroceder hasta el comienzo de lo que escribió.

Esto funcionó para mí:

 #!/usr/bin/python import os data = "xxxxxxxxxxxxxxxx" dev = os.open("/dev/sdp1", os.O_RDWR) os.write(dev,data) os.lseek(dev,0,os.SEEK_SET) print os.read(dev,16)
over 4 years ago · Santiago Trujillo Denunciar

0

El problema resultó estar en el controlador del dispositivo. El método read() registrado con file_operations del controlador invocó copy_to_user() pero luego devolvió 0 en lugar del número de bytes copiados en el espacio de usuario.

El código C anterior "funcionó" porque en realidad no verificó el valor de retorno de read() y buff se estaba completando con la respuesta.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda