现在的位置: 首页 > 综合 > 正文

不要相信 errno 可靠

2014年02月07日 ⁄ 综合 ⁄ 共 884字 ⁄ 字号 评论关闭

最近发现第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();
            }

【上篇】
【下篇】

抱歉!评论已关闭.