我正在使用ioctl()
从块设备读取数据(scsi。)
我注意到当我阅读1024
个扇区时,ioctl
完成没有问题。当我阅读2048
后,经过一段时间后,它会返回ENOMEM
(errno=12
),这甚至没有列在可能的错误列表中(请参阅http://man7.org/linux/man-pages/man2/ioctl.2.html)
我已经检查过我正在传递适当的缓冲区大小,所以情况并非如此 - 没有缓冲区溢出。
如何使用ioctl
来学习要读取的最大缓冲区大小?
其他一些信息可能会有所帮助:
Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
2.6.18-128.el5
答案 0 :(得分:0)
错误发生在Linux内存管理的默认行为上,即#34;过度使用"。这意味着内核声称成功分配了内存,但实际上并没有在您尝试访问内存之前分配内存。如果内核发现它分配了太多内存,它就会杀死一个进程,其中包括ENOMEM(Out Of Memory)杀手"释放一些记忆。它选择杀死进程的方式很复杂,但是如果你刚刚在系统中分配了大部分内存,那么它可能就是你的进程可以解决问题。
要更改此行为,请尝试以下操作:
echo "2" > /proc/sys/vm/overcommit_memory
在Linux 2.6及更高版本中,可以修改内核的行为,以便它不会过度使用"记忆。尽管此设置不会阻止OOM杀手完全被调用,但它会显着降低机会,从而导致更强大的系统行为。这是通过sysctl选择严格过度使用模式来完成的:
sysctl -w vm.overcommit_memory=2