2008-09-25 33 views
8

Đây là mã:Đọc/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(); 
    } 

Nếu không, làm thế nào để làm cho nó thread-an toàn không?

Trả lời

10

Chừng nào mỗi thực hiện các chức năng là trong chủ đề riêng của mình (ví dụ, các biến địa phương number, urandom, bytes_read không được chia sẻ giữa các chủ đề), tôi không thấy bất kỳ vấn đề thread-an toàn. Mỗi chuỗi sau đó sẽ có bộ mô tả tệp riêng của nó vào /dev/urandom. /dev/urandom có thể được mở đồng thời từ nhiều quá trình, vì vậy không sao.

Nhân tiện, /dev/urandom có thể không mở được và mã của bạn nên giải quyết. Một số nguyên nhân là: chạy ra khỏi các mô tả tập tin có sẵn; /dev không được gắn đúng cách (mặc dù trong trường hợp này bạn có vấn đề lớn hơn); chương trình của bạn đang được chạy trong một số đặc biệt chroot từ chối quyền truy cập vào bất kỳ thiết bị nào; vv ..

+0

Rõ ràng nó phải an toàn, vì lợi ích của sự tỉnh táo, nhưng tôi không thể tìm thấy bất cứ điều gì trong con người 4 ngẫu nhiên mà chỉ định rằng nó được. Ví dụ, nếu urandom đã giảm trở lại chế độ PRNG, có thể hai người gọi đồng thời bao giờ thấy cùng một đầu ra khác với cơ hội không? Chắc chắn là không, nhưng các tài liệu nói không? –

+0

"Thấy cùng một đầu ra" là một trường hợp đặc biệt của "ngẫu nhiên". :-) –

+0

@SteveJessop: Tài liệu không cần phải nói rằng giao diện hoạt động. Ngoài ra, urandom chỉ có một chế độ. –

Các vấn đề liên quan