2008-09-25 16 views
8

Voici le code:Lit/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(); 
    } 

Sinon, comment puis-je faire thread-safe?

Répondre

10

Tant que chaque exécution de la fonction est dans son propre thread (à savoir, les variables locales number, urandom, bytes_read sont pas partagés entre threads), je ne vois pas de problème de sécurité des threads. Chaque thread aura alors son propre descripteur de fichier en /dev/urandom. /dev/urandom peut être ouvert simultanément à partir de plusieurs processus, alors c'est d'accord.

Par ailleurs, /dev/urandom peut ne pas ouvrir, et votre code doit gérer. Certaines causes sont: épuisement des descripteurs de fichiers disponibles; /dev pas correctement monté (bien que dans ce cas vous avez de plus gros problèmes); votre programme est exécuté dans un chroot spécial qui refuse l'accès à tous les périphériques;

+0

De toute évidence, il devrait être sûr, pour des raisons de santé mentale, mais je ne peux rien trouver dans l'homme 4 aléatoire qui spécifie qu'il est. Par exemple, si Urandom est revenu en mode PRNG, deux appelants simultanés pourraient-ils voir la même sortie autrement que par hasard? Sûrement pas, mais où les docs ne disent-ils pas? –

+0

"Voir la même sortie" est un cas particulier de "random". :-) –

+0

@SteveJessop: La documentation n'a pas besoin de dire que l'interface fonctionne. En outre, urandom n'a qu'un seul mode. –

Questions connexes