2008-09-25 10 views
8

Este es el código:¿Está leyendo/dev/urandom thread-safe?

 
    unsigned int number; 
    FILE* urandom = fopen("/dev/urandom", "r"); 
    if (urandom) { 
    size_t bytes_read = fread(&number, 1, sizeof(number), urandom); 
    DCHECK(bytes_read == sizeof(number)); 
    fclose(urandom); 
    } else { 
    NOTREACHED(); 
    } 

Si no, ¿cómo puedo hacer que el hilo de seguridad?

Respuesta

10

Mientras cada ejecución de la función es en su propio hilo (es decir, las variables locales number, urandom, bytes_read no se comparten entre hilos), I aún no hay problemas de hilo de seguridad. Cada hilo tendrá su propio descriptor de archivo en /dev/urandom. /dev/urandom se puede abrir simultáneamente desde múltiples procesos, así que está bien.

Por cierto, /dev/urandom puede no abrirse, y su código debería ocuparse de ello. Algunas causas son: quedarse sin descriptores de archivos disponibles; /dev no montado correctamente (aunque en este caso tiene problemas mayores); su programa se está ejecutando en un chroot especial que niega el acceso a cualquier dispositivo; etc.

+0

Claramente debe ser seguro, por el bien de la cordura, pero no puedo encontrar nada en el hombre 4 al azar que especifique que sí lo es. Por ejemplo, si urandom ha vuelto al modo PRNG, ¿podrían dos emisores de llamadas simultáneos ver el mismo resultado por casualidad? Seguramente no, pero ¿dónde dicen los doctores? –

+0

"Ver el mismo resultado" es un caso especial de "aleatorio". :-) –

+0

@SteveJessop: La documentación no necesita decir que la interfaz funciona. Además, urandom solo tiene un modo. –

Cuestiones relacionadas