Problema con read/write system calls

Iniciado por xaps, 8 Junio 2014, 00:10 AM

0 Miembros y 2 Visitantes están viendo este tema.

xaps

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:

  while(read(src_fc, buffer, strlen(buffer)) > 0)
  {
    if(write(obj_fd, buffer, strlen(buffer)) < 0)
    {
      strcpy (buffer, "Error in write.\n");
      write (1, buffer, strlen (buffer));
    }
  }


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!
"The programmers of tomorrow are the wizards of the future" - Gave Newel

Eternal Idol

#1
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.
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

#2
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.
"The programmers of tomorrow are the wizards of the future" - Gave Newel

Eternal Idol

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.
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

Cita de: Eternal Idol en  8 Junio 2014, 14:36 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:

int size;
  while((size = read(src_fc, buffer, 512)) > 0)
  {
    if(write(obj_fd, buffer, size) < 0)
    {
      strcpy (buffer, "Error in write.\n");
      write (1, buffer, strlen (buffer));
      exit(1);
    }
  }


¡Gracias por la ayuda!

Un saludo.
"The programmers of tomorrow are the wizards of the future" - Gave Newel

Eternal Idol

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