read from /dev/urandom 返回值异常

本文探讨了在SUSE 12系统中使用/dev/urandom读取随机数据时遇到的问题,即读取长度与预期不符,实际读取量总比预期少1。通过查阅手册发现,自Linux 3.16版本起,从/dev/urandom进行的read(2)操作最多只能返回32MB的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include <fcntl.h>
 4 #include <sys/mman.h>
 5 using namespace std;
 6 int main(int argc,char* argv[])
 7 {
 8     ssize_t bytesToWrite = 32*1024*1024;
 9     const char *pathZero = "/dev/zero";
10     int fdZero = open(pathZero, O_RDONLY);
11     void *pageBuffPtr = mmap(NULL, bytesToWrite, PROT_READ | PROT_WRITE, MAP_PRIVATE, fdZero, 0);
12     int randomData = open("/dev/urandom", O_RDONLY);
13     if (randomData < 0)
14     {
15         // something went wrong
16     }
17     else
18     {
19         char* myRandomData;
20         ssize_t result = read(randomData, pageBuffPtr, bytesToWrite);
21         if (result < 0)
22         {
23             // something went wrong
24         }
25         cout <<"len:"<<bytesToWrite << endl;
26         cout <<"result:"<<result << endl;
27     }
28     return 0;
29 }

以上代码运行在suse12上,len和result总是差1

后来查看urandom的man手册中有这么一句:Since Linux 3.16, a read(2) from /dev/urandom will return at most 32 MB

即最大只能读 32MB -1

转载于:https://www.cnblogs.com/zyw567/p/9685603.html

#!/bin/sh # 捕获信号,确保脚本退出时终止所有后台进程并卸载硬盘 trap "cleanup" INT TERM EXIT # 清理函数 cleanup() { echo "捕获到中断信号,正在清理..." for pid in $pids; do kill $pid 2>/dev/null # 终止所有后台进程 done wait # 等待所有后台进程退出 umount_all # 卸载所有挂载的硬盘 echo "脚本已停止。" exit 1 } # 卸载所有挂载的硬盘 umount_all() { for mount_point in $(mount | grep "/mnt/ssd" | awk '{print $3}'); do umount "$mount_point" 2>/dev/null echo "已卸载 $mount_point" done } # 检查 NVMe 硬盘是否在位,并识别数量 nvme_disks=$(lsblk -d -o NAME | grep -E '^nvme[0-9]+n[0-9]+$') # 检查是否有 NVMe 硬盘 if [ -z "$nvme_disks" ]; then echo "未找到 NVMe 硬盘" exit 1 fi # 记录开始时间 start_time=$(date +%s) end_time=$((start_time + 600)) # 10分钟 # 创建日志目录 log_dir="/mnt/ssd_test_logs" mkdir -p "$log_dir" # 格式化并挂载 NVMe 硬盘 index=1 for disk in $nvme_disks; do partition="/dev/${disk}p1" # 假设每个 NVMe 硬盘的第一个分区是 ${disk}p1 mount_point="/mnt/ssd${index}" log_file="$log_dir/${disk}_test_log.txt" # 检查分区是否存在 if [ ! -b "$partition" ]; then echo "$partition 不存在,尝试创建分区" >> "$log_file" echo -e "n\np\n1\n\n\nw" | fdisk "/dev/$disk" # 创建新分区 fi # 检查文件系统类型是否为 EXT4 fs_type=$(blkid -o value -s TYPE "$partition") if [ "$fs_type" != "ext4" ]; then echo "$partition 文件系统类型为 $fs_type,正在格式化为 EXT4" >> "$log_file" mkfs.ext4 -F "$partition" # 强制格式化为 ext4 fi # 卸载分区(如果已挂载) umount "$partition" 2>/dev/null || true # 创建挂载点 if mountpoint -q "$mount_point"; then echo "挂载点 $mount_point 已被占用,尝试卸载并重新挂载" >> "$log_file" umount "$mount_point" 2>/dev/null || true fi mkdir -p "$mount_point" # 挂载分区 mount -t ext4 "$partition" "$mount_point" if [ $? -ne 0 ]; then echo "挂载 $partition 到 $mount_point 失败" >> "$log_file" continue fi index=$((index + 1)) done # 并行测试函数 test_disk() { disk=$1 partition="/dev/${disk}p1" mount_point="/mnt/ssd$2" log_file="$log_dir/${disk}_test_log.txt" # 进入挂载目录 cd "$
最新发布
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值