Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: xaps en 8 Junio 2014, 00:10 am



Título: Problema con read/write system calls
Publicado por: xaps 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!


Título: Re: Problema con read/write system calls
Publicado por: Eternal Idol 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.


Título: Re: Problema con read/write system calls
Publicado por: xaps 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.


Título: Re: Problema con read/write system calls
Publicado por: Eternal Idol 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.


Título: Re: Problema con read/write system calls
Publicado por: xaps 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.


Título: Re: Problema con read/write system calls
Publicado por: Eternal Idol en 8 Junio 2014, 15:28 pm
De nadas  ::)