Título: Escribir en archivos con file descriptors introduce caracteres extraños Publicado por: nullx100 en 23 Abril 2022, 11:54 am He realizado un programa que mediante un descriptor de archivos escribe en el archivo /tmp/note el mensaje que se le ha pasado como argumento + el id de usuario que ejecuta el programa.
El programa se ha probado a ejecutar como un usuario con el id 1000 y con root (id 0). En ninguno de los dos consigo que se escriba de forma correcta. En el primer caso muestra caracteres raros y en el segundo al ser 0 el id de root me parece que lo toma como un caracter de fin de string y no escribe nada. Código: LIbreria customfunctions.h Código: #include <stdio.h> No tengo mucha soltura con gdb pero lo he intentado. He puesto un breakpoint antes de la linea if(write(fd, &userid, sizeof(int) == -1)... Muestro la pila Código: (gdb) backtrace full El resultado de la ejecución es el siguiente: Código: superdog@ubuntu:~/home/superdog$ cat /tmp/note Alguna idea de lo que esta mal? Thanks. Título: Re: Escribir en archivos con file descriptors introduce caracteres extraños Publicado por: nullx100 en 23 Abril 2022, 14:07 pm Creo que se por donde van los tiros.
Con la herramienta hexdump he analizado la nota y veo que el user id si que esta, pero está invertido debido al little endian y como en memoria se guarda inverso pasa al archivo de forma inversa también. Título: Re: Escribir en archivos con file descriptors introduce caracteres extraños Publicado por: RayR en 23 Abril 2022, 17:22 pm Es cierto que x86/x64 son little endian, pero eso no es lo que causa tu problema. Los editores de texto y el comando cat esperan un archivo de texto, pero en la línea
Código
estás escribiendo un valor entero en el archivo. Obviamente si se intenta leer como ASCII o UTF-8, se van a mostrar símbolos raros. Necesitas convertir userid a texto, por ejemplo, mediante sprintf o snprintf, y luego guardar esa cadena resultante. Tienes otro error importante. Los elementos de argv son punteros, no arrays. Así, esto: Código
está mal, pues sizeof devolverá el tamaño de un puntero (4 u 8), por lo que si el mensaje no cabe en esa cantidad de bytes, estarás sobrescribiendo bytes indebidos. Lo que necesitas pasar a ec_malloc es: "strlen(argv[1]) + 1". |