miq01
13/12/2005, 10:44
Por si interesa, y para que quede constancia:
Recordemos que el Linux de GP2X (no sé si es aplicable a cualquier Linux) accede a disco en modo asíncrono por defecto. Es decir, si por ejemplo una aplicación decide escribir algo a disco, en realidad se escribe en un buffer y Linux decide cuándo lo pasa realmente a disco. Esto puede provocar que ciertas operaciones de escritura no se realicen si, por ejemplo, apagamos la consola con la aplicación abierta y Linux aún no ha volcado el contenido del buffer en disco. Era el caso de DrMD (ya solucionado en la nueva versión), y también pasaba en Tilematch (a veces la tabla de puntuaciones máximas no se escribía).
Pues bien, a parte de la posibilidad de crear un script que fuerce este modo de escritura, tal como se explica en el tutorial sobre scripting (http://www.gp32spain.com/foros/showthread.php?t=25060), también se puede hacer desde C. ¿Cómo? Ejecutando la instrucción sync() (http://seth.positivism.org/man.cgi/2/sync) después de una llamada a fclose():
FILE* archivo = fopen(...);
fwrite(...);
fclose(archivo);
sync();
Puesto que sync() está en unistd.h, será necesario añadir
#include <unistd.h>
Por cierto, yo he probado otra alternativa, consistente en llamar a execl(...) para que ejecute el comando sync de bash al empezar la aplicación (y luego he probado lo mismo, pero justo antes de salir) pero no he conseguido que funcione.
Recordemos que el Linux de GP2X (no sé si es aplicable a cualquier Linux) accede a disco en modo asíncrono por defecto. Es decir, si por ejemplo una aplicación decide escribir algo a disco, en realidad se escribe en un buffer y Linux decide cuándo lo pasa realmente a disco. Esto puede provocar que ciertas operaciones de escritura no se realicen si, por ejemplo, apagamos la consola con la aplicación abierta y Linux aún no ha volcado el contenido del buffer en disco. Era el caso de DrMD (ya solucionado en la nueva versión), y también pasaba en Tilematch (a veces la tabla de puntuaciones máximas no se escribía).
Pues bien, a parte de la posibilidad de crear un script que fuerce este modo de escritura, tal como se explica en el tutorial sobre scripting (http://www.gp32spain.com/foros/showthread.php?t=25060), también se puede hacer desde C. ¿Cómo? Ejecutando la instrucción sync() (http://seth.positivism.org/man.cgi/2/sync) después de una llamada a fclose():
FILE* archivo = fopen(...);
fwrite(...);
fclose(archivo);
sync();
Puesto que sync() está en unistd.h, será necesario añadir
#include <unistd.h>
Por cierto, yo he probado otra alternativa, consistente en llamar a execl(...) para que ejecute el comando sync de bash al empezar la aplicación (y luego he probado lo mismo, pero justo antes de salir) pero no he conseguido que funcione.