Sco*_*ski 14 php linux filesystems file-io bsd
在处理从中/dev/urandom生成随机字节的项目时,建议我检查以确保它/dev/urandom不仅仅是一个文件.
最直接的方式似乎是这样的:
/**
* Is the given file a device?
*
* @param string|resource $file
* @return boolean
*/
function is_device($file)
{
if (is_resource($file)) {
$stat = fstat($file);
} elseif (is_readable($file) && !is_link($file)) {
$stat = stat($file);
} else {
return false;
}
return $stat['rdev'] !== 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是双重的:
$stat['rdev'] !== 0检查失败的情况?重要提示:我需要的解决方案必须是PHP,而不依赖于任何PECL扩展或自定义C代码.该项目是PHP 7的纯PHP 5填充random_bytes()和random_int()函数,可以由Composer安装在任何其他人的PHP 5项目中.
好吧,你可以使用 filetype()。
如果你对 urandom 进行快速 ll,你会看到:
ll /dev/urandom
crw-rw-rw- 1 root root 1, 9 Jul 26 17:38 /dev/urandom
Run Code Online (Sandbox Code Playgroud)
开头的“c”表示它是“字符”文件类型。您可以在此处查看所有不同的文件类型:
https://en.wikipedia.org/wiki/Unix_file_types
这意味着如果你运行
filetype("/dev/urandom");
Run Code Online (Sandbox Code Playgroud)
你会得到“char”,意思是字符文件类型。这应该够了吧。