Re: Generar numeros aleatorios con gcc
Bueno, esto no es portable :( Y por otro lado, hay algunos problemas.
El primero, es que el sistema podría poner a dormir el programa
si no hay suficientes bytes de calidad. Para algunas aplicaciones esto
no es viable. Si no se requieren bytes de tanta calidad, mejor sería
usar /dev/urandom.
En todo caso, si quieres usar /dev/random, toca verificar el
número de bytes que retorna la llamada read, en caso de que la
lectura sea incompleta (algo que puede pasar justo antes de un
EOF).
void linux_rand( BYTE * cadenarnd){
int fd;
fd=open("/dev/random",O_RDONLY);
if (!fd)
return;
read(fd,cadenarnd,RND_LEN);
close (fd);
}
Creo que si me tocara leer de /dev/random, escribiría algo como:
#include <stdio.h>
#include <stdlib.h>
static FILE *rndf = 0;
void
linux_rand(char *buff, size_t size)
{
int nread;
if (!rndf)
{
rndf = fopen("/dev/random", "r");
#if 0 /* Dev urandom no se bloquea si se acaban los bytes de calidad */
rndf = fopen("/dev/urandom", "r");
#endif
if (!rndf)
perror("fopen"), exit(EXIT_FAILURE);
}
while (size > 0)
{
nread = fread(buff, 1, size, rndf);
if (!nread)
{
if (feof(rndf))
fprintf(stderr, "EOF in /dev/random\n"); /* Nunca pasa? */
else
perror("fread");
exit(EXIT_FAILURE);
}
size = size - nread;
buff = buff + nread;
}
}
#define SIZE 1024
int
main(int argc, char *argv[])
{
char buff[SIZE];
int i;
linux_rand(buff, SIZE);
for (i = 0; i < SIZE; ++i)
printf("buff[i] = %d\n", buff[i]);
return EXIT_SUCCESS;
}
Si el programa se duerme, toca mover el ratón :) O hacer cosas que
alimenten al "entropy pool".
Me corrigen si hay un error.
Atte,
Nelson.-
--
http://arhuaco.org/
Reply to: