A leitura de /dev/urandom é segura para threads?
-
02-07-2019 - |
Pergunta
Este é o código:
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();
}
Se não, como posso torná-lo seguro para threads?
Solução
Contanto que cada execução da função esteja em seu próprio thread (ou seja, as variáveis locais number
, urandom
, bytes_read
não são compartilhados entre threads), não vejo nenhum problema de segurança de thread.Cada thread terá então seu próprio descritor de arquivo em /dev/urandom
. /dev/urandom
pode ser aberto simultaneamente a partir de vários processos, então tudo bem.
Por falar nisso, /dev/urandom
pode falhar ao abrir e seu código deve lidar com isso.Algumas causas são:ficar sem descritores de arquivo disponíveis; /dev
não montado corretamente (embora neste caso você tenha problemas maiores);seu programa está sendo executado em um especial chroot
que nega acesso a quaisquer dispositivos;etc.