Linux嵌入式

时间:2015-10-30 15:58:31

标签: out-of-memory embedded-linux system-calls

我正在努力解决std :: system()的奇怪行为...... 检查SysCall的可用性我使用以下字符串
int result = system();
(如果结果是0那么shell是可操作的,否则不是)
我看到在我的进程分配了大量内存后,调用system()停止工作;当进程释放时,内存系统()再次工作 为了检查问题的可重复性,我编写了一个非常简单的程序,它每1ms分配一个比前一个更大的新向量,它检查system()可用性然后删除向量(参见下面的代码)
int result = system();

unsigned char *dbg_mem = NULL;
tmr_debug.stop();
int sysSts=0;  
dbg_mem = new unsigned char[nTmr_debug*1024*1024];
if (dbg_mem==NULL)
    {
        qDebug("Mem request fails: size =%d MB !!!!!",nTmr_debug);
    }
    else
    {
        memset((void*)dbg_mem,0xFF,nTmr_debug*1024*1024);
    }
sysSts =system("");
qDebug("Debug Mem: %dMB\t\t result:%d",nTmr_debug, sysSts);
if (dbg_mem)
    delete dbg_mem;
if(sysSts!=0)
    {
        qDebug("****RETRY**** after delete\t result:%d",system(""));
    }
nTmr_debug ++;
tmr_debug.start(1);

Sw返回没有错误,直到矢量大小达到72Mb然后返回-1;如果我重新恢复记忆的作用:

调试内存:62MB结果:0
调试内存:63MB结果:0
调试内存:64MB结果:0
调试内存:65MB结果:0
调试内存:66MB结果:0
调试内存:67MB结果:0
调试内存:68MB结果:0
调试内存:69MB结果:0
调试内存:70MB结果:0
调试内存:71MB结果:-1
****删除结果后重试****:0
调试内存:72MB结果:-1
****删除结果后重试****:0
调试内存:73MB结果:-1
****删除结果后重试****:0
调试内存:74MB结果:-1
****删除结果后重试****:0
调试内存:75MB结果:-1
****删除结果后重试****:0
调试内存:76MB结果:-1

如您所见,我仍然有很多记忆:

调试内存:135MB结果:-1
****删除结果后重试****:0
调试内存:136MB结果:-1
****删除结果后重试****:0
调试内存:137MB结果:-1
****删除结果后重试****:0
调试内存:138MB结果:-1
****删除结果后重试****:0
调试内存:139MB结果:-1
****删除结果后重试****:0
调试内存:140MB结果:-1
****删除结果后重试****:0
内存不足:杀死进程2127(MemSizeChek)得分2374或者是孩子
杀死过程2127(MemSizeChek)
杀了

cat / proc / meminfo:
MemTotal:176732 kB
MemFree:144536 kB
缓冲器:100 kB
缓存:2440 kB
SwapCached:0 kB
有效:328 kB
不活动:3096 kB
有效(匿名):64 kB
非活动(匿名):1044 kB
活动(文件):264 kB
无效(文件):2052 kB
不可挽回:0 kB
Mlocked:0 kB
SwapTotal:0 kB
SwapFree:0 kB
脏:16 kB
回写:0 kB
AnonPages:912 kB
映射:840 kB
Shmem:224 kB
板坯:3208 kB
SReclaimable:1092 kB
SUnreclaim:2116 kB
KernelStack:296 kB
PageTables:112 kB
NFS_Unstable:0 kB
弹跳:0 kB
WritebackTmp:0 kB
CommitLimit:88364 kB
Committed_AS:2936 kB
VmallocTotal:647168 kB
VmallocUsed:4108 kB
VmallocChunk:634876 kB

我正在开发一个配备在Linux TexasDM3730上运行的Linux Kernel 2.6.32的自定义主板 工具链:arm-2009q1-203-arm-none-linux-gnueabi - > gcc版本4.3.3(Sourcery G ++ Lite 2009q1-203)
IDE:Qt Creator 2.5.2

提前感谢任何建议

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:std :: system()调用在fork()中使用。当fork在2个进程中拆分主进程时,SO必须保留每个进程所需的大量内存。对于只调用shell命令的子进程,实际上并不需要这种内存。

要重新解析我已经改变了过度使用的内存配置: " echo 1>的/ proc / SYS / VM / overcommit_memory" 现在它有效!