elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con read/write system calls
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con read/write system calls  (Leído 2,493 veces)
xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Problema con read/write system calls
« en: 8 Junio 2014, 00:10 am »

Buenas noches,
estoy haciendo un programa para aprovechar la característica del EOF para ocultar archivos dentro de otros, pero tengo un problema un tanto extraño al escribir en el archivo "objetivo". Cuando hago una pequeña modificación en uno de los while del programa, deja de escribirme el archivo completo y escribe solo unos pocos bytes. Concretando:

Código fuente (funcionando)
http://pastebin.com/ygNq6K1t

La modificación que estoy realizando es substituir el código del while de la línea 31 por el siguiente:
Código
  1.  while(read(src_fc, buffer, strlen(buffer)) > 0)
  2.  {
  3.    if(write(obj_fd, buffer, strlen(buffer)) < 0)
  4.    {
  5.      strcpy (buffer, "Error in write.\n");
  6.      write (1, buffer, strlen (buffer));
  7.    }
  8.  }
  9.  

Como se puede ver, la única diferencia es que elimino el mensaje de "512b.", pero aun asi la aplicación deja de leer/escribir a los pocos bytes copiados.

¿Alguna idea?

¡Muchas gracias!


En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con read/write system calls
« Respuesta #1 en: 8 Junio 2014, 08:42 am »

No mire el codigo del enlace pero ya en la primera linea que dejaste aca no tiene sentido usar strlen, lo que queres que lea es maximo el tamaño del buffer y no de la cadena que hubiera antes en el buffer.


« Última modificación: 8 Junio 2014, 14:23 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Re: Problema con read/write system calls
« Respuesta #2 en: 8 Junio 2014, 13:34 pm »

En clase de Sistemas Operativos me han enseñado a hacerlo de esa manera, ademas de que eso no cambia de la version que funciona a la que no funciona. De todas formas, cambiando el strlen(buffer) del read por 512 sigue dando el mismo problema.

¿Alguna idea?

EDIT: Eternal Idol Acabo de comprobar lo del strlen con un buffer vacío y tenías razon, no me devuelve 512 sino un valor distinto. De todas maneras, no parece que sea la fuente del problema.
« Última modificación: 8 Junio 2014, 13:45 pm por xaps » En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con read/write system calls
« Respuesta #3 en: 8 Junio 2014, 14:36 pm »

Deberias leer el tamaño de tu buffer (no te olvides de abrir los archivos en modo binario) y escribir la misma cantidad de bytes leidos que retorna read. Asi que depuralo, fijate que retorna read, que retorna write y cuando se termina el bucle.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Re: Problema con read/write system calls
« Respuesta #4 en: 8 Junio 2014, 15:13 pm »

escribir la misma cantidad de bytes leidos que retorna read

En el clavo. El strlen devuelve el tamaño del buffer hasta el primer byte nulo (que es como termina una string), pero en este caso no estoy analizando cadenas, sino bytes individuales donde probablemente haya bytes nulos muy freqüentemente, por lo que la cantidad de bytes que escribia en cada iteración podia llegar a ser hasta 0 en el peor caso, de manera que perdia una gran cantidad de información. Así que realizando unos pequeños cambios en el bucle while he conseguido que me funcione perfectamente.

Adjunto el código del bucle tal como quedaría:
Código
  1. int size;
  2.  while((size = read(src_fc, buffer, 512)) > 0)
  3.  {
  4.    if(write(obj_fd, buffer, size) < 0)
  5.    {
  6.      strcpy (buffer, "Error in write.\n");
  7.      write (1, buffer, strlen (buffer));
  8.      exit(1);
  9.    }
  10.  }

¡Gracias por la ayuda!

Un saludo.
En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con read/write system calls
« Respuesta #5 en: 8 Junio 2014, 15:28 pm »

De nadas  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
El Nuevo ImgBurn no tiene la opción de "Read" sólo de escritura "Write" (¿?)
Software
Ad0nis 0 3,596 Último mensaje 27 Octubre 2006, 14:10 pm
por Ad0nis
problema con read() y open() C
Programación C/C++
soyloqbuskas 3 2,175 Último mensaje 1 Octubre 2012, 22:20 pm
por soyloqbuskas
System calls kernel 3.2.34
GNU/Linux
dRak0 1 1,756 Último mensaje 7 Enero 2013, 13:13 pm
por xv0
Problema con javascript: Document.write me tiene mania!!!!! « 1 2 3 4 »
Desarrollo Web
z3nth10n 31 14,826 Último mensaje 7 Mayo 2013, 23:00 pm
por z3nth10n
Por que read no funciona con system?
Programación C/C++
Lieutenant McFarley 4 3,212 Último mensaje 24 Marzo 2022, 23:45 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines