Autor
|
Tema: Problema con read/write system calls (Leído 2,452 veces)
|
xaps
Desconectado
Mensajes: 157
|
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/ygNq6K1tLa 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!
|
|
|
En línea
|
"The programmers of tomorrow are the wizards of the future" - Gave Newel
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 157
|
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
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 157
|
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 )); } }
¡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
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
|
|
|
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,556
|
27 Octubre 2006, 14:10 pm
por Ad0nis
|
|
|
problema con read() y open() C
Programación C/C++
|
soyloqbuskas
|
3
|
2,144
|
1 Octubre 2012, 22:20 pm
por soyloqbuskas
|
|
|
System calls kernel 3.2.34
GNU/Linux
|
dRak0
|
1
|
1,727
|
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,524
|
7 Mayo 2013, 23:00 pm
por z3nth10n
|
|
|
Por que read no funciona con system?
Programación C/C++
|
Lieutenant McFarley
|
4
|
3,136
|
24 Marzo 2022, 23:45 pm
por RayR
|
|