最近发现第3方提供的 API, 引起内存不断增大,代码如下:
int retVal = kill(pSharedData->regBuffPids[i],0);
if (retVal == 0)
{
LOGE("Signal Sent Successfully....");
return false;
}
else
{
LOGE("Kill failed....");
}
if (errno == EPERM)
{
LOGE("signal permission failure!");
return false;
}
else if (errno == EINVAL)
{
LOGE("invalide signal");
return false;
}
else if (errno == ESRCH)
{
LOGE("no process found for the specific pid");
release_share_memory();
}它用 kill(pid,0) 检查进程是否存在,不存在,就释放共享内存。
但其实我们发现运行 LOGE() , errno 期望是3, 但却变成 2 ,原来我们自己改动过的 LOGE() 中调用了 localtime, 它读不到时区文件,所以把 errno 设置成 2
因此不要相信 errno 可靠, 有必要先用临时变量保存。
int retVal = kill(pSharedData->regBuffPids[i],0);
int errnoVal = errno;
if (retVal == 0)
{
LOGE("Signal Sent Successfully....");
return false;
}
else
{
LOGE("Kill failed....");
}
if (errnoVal == EPERM)
{
LOGE("signal permission failure!");
return false;
}
else if (errnoVal == EINVAL)
{
LOGE("invalide signal");
return false;
}
else if (errnoVal == ESRCH)
{
LOGE("no process found for the specific pid");
release_share_memory();
}
本文介绍了一个第三方API导致内存持续增长的问题。通过分析发现,问题出在使用kill(pid,0)检查进程存在性时,错误地修改了errno值。文章详细解释了如何避免此问题,并提出了解决方案。

1万+

被折叠的 条评论
为什么被折叠?



