2008-09-25 12 views
8

ist der Code:Wird/dev/urandom thread-sicher gelesen? Dieser

 
    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(); 
    } 

Wenn nicht, wie kann ich es Thread-sicher?

Antwort

10

Solange jede Ausführung der Funktion in einem eigenen Thread ist (das heißt, die lokalen Variablen number, urandom werden bytes_read nicht zwischen Threads gemeinsam genutzt), I keine fadenSicherheitsProbleme sehen. Jeder Thread hat dann seinen eigenen Dateideskriptor in /dev/urandom. /dev/urandom kann gleichzeitig von mehreren Prozessen geöffnet werden, also ist das in Ordnung.

Übrigens, /dev/urandom kann nicht öffnen, und Ihr Code sollte damit umgehen. Einige Ursachen sind: keine verfügbaren Dateideskriptoren mehr; /dev nicht richtig montiert (obwohl in diesem Fall haben Sie größere Probleme); Ihr Programm wird in einer speziellen chroot ausgeführt, die den Zugriff auf alle Geräte verweigert; usw.

+0

Natürlich sollte es sicher sein, der Vernunft halber, aber ich kann nichts in Mann 4 zufällig finden, das angibt, dass es ist. Zum Beispiel, wenn der Zufallsgenerator wieder in den PRNG-Modus zurückgefallen ist, könnten zwei gleichzeitige Anrufer jemals die gleiche Ausgabe anders als zufällig sehen? Sicher nicht, aber wo sagen die Ärzte nicht? –

+0

"Die gleiche Ausgabe sehen" ist ein Sonderfall von "zufällig". :-) –

+0

@SteveJessop: Die Dokumentation muss nicht sagen, dass die Schnittstelle funktioniert. Außerdem hat urandom nur einen Modus. –