int iRet=system("ls -l");
if (0 != iRet)
{
PRERR("system(\"ls -l\") %s",strerror(errno));
}
运行结果:
ERR: system("ls -l") Cannot allocate memory File:../can/can.c, Line:186, Function:init_CanFrameData
分析:
1.
top命令:
Mem: 54580K used, 2540K free, 0K shrd, 0K buff, 20728K cached
CPU: 0.1% usr 1.3% sys 0.0% nic 98.4% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 3.92 4.06 4.10 2/131 12094
PID PPID USER STAT VSZ %MEM CPU %CPU COMMAND
4282 2563 root R 2156 3.7 0 1.0 top
2.
[root@mbike comm]# cat /proc/meminfo
MemTotal: 57120 kB
MemFree: 2300 kB
Buffers: 0 kB
Cached: 20732 kB
SwapCached: 0 kB
Active: 23632 kB
Inactive: 15012 kB
Active(anon): 17928 kB
Inactive(anon): 32 kB
Active(file): 5704 kB
Inactive(file): 14980 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 17944 kB
Mapped: 8116 kB
Shmem: 48 kB
Slab: 5332 kB
SReclaimable: 2120 kB
SUnreclaim: 3212 kB
KernelStack: 1048 kB
PageTables: 960 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 28560 kB
Committed_AS: 554924 kB
VmallocTotal: 811008 kB
VmallocUsed: 4488 kB
VmallocChunk: 801788 kB
3.
[root@mbike comm]# cat /proc/sys/vm/overcommit_memory
0
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。
结论:
可能是被fork的进程的虚拟地址空间占用太多,同时你的overcommit参数设置为0,当虚拟地址空间占用超过一定量(物理内存和swap计算)后,就会失败.
优化一下程序的内存使用量或者overcommit_memory设置为其他值