我正在努力解决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
提前感谢任何建议
答案 0 :(得分:0)
我找到了解决方案:std :: system()调用在fork()中使用。当fork在2个进程中拆分主进程时,SO必须保留每个进程所需的大量内存。对于只调用shell命令的子进程,实际上并不需要这种内存。
要重新解析我已经改变了过度使用的内存配置: " echo 1>的/ proc / SYS / VM / overcommit_memory" 现在它有效!