xixitalk's snippet

Post Longer Than 140 Characters Tweets

Sep 15, 2016 - Comments

造了一个轮子:sleep命令

我们一个嵌入式平台,系统是uClinux,不支持动态库,只能用静态库,每个程序都包含了所有调用的函数代码,包括C库的。客户一个产品压力测试时偶现系统内存不够,期望当天我们能协助他们解决,内存优化有很多方向,不好入手啊。

通过分析内存不够的现场,系统内存还有一些,但是碎片化了,物理连续的256K的内存块都没有了。同时发现客户有两个常驻的sh进程,两个sh程序都用sleep做等待循环。linux命令用的是busybox,任何一个命令都是运行busybox。运行一个busybox要耗费512K内存,sleep命令也是这样。

两个sleep本身就占用1M,把sh脚本分拆,在代码里sleep,就会去掉这个内存占用,是个可以优化出一点内存的方法。但是经过沟通客户不愿意修改sh脚本,从项目考虑我也理解。后来我脑洞大开了一下,觉得sleep命令最后就是简单调用sleep函数,为何不重新实现一个,不用busybox的那个呢。重新实现了一个sleep命令,替换busybox里的sleep命令,这样就能减少sleep的内存占用了

于是写了一个最简单的只有20行的sleep命令,不支持s m h d 参数,不支持浮点数,静态编译出来只有10K,加上默认4K栈空间,运行时候16K内存就足够了,这样就能节省出这1M内存,经过客户测试发现问题解决了。好啊,中秋节不用加班了。(备注:南京受台风影响,中秋节下了一整天雨,这篇博客就是中秋节写的。)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    unsigned long int timelen = 0;
    int i = 0;

    if(1 == argc)
        return -1;

    for(i = 1; i < argc; i++)
        timelen += strtoul(argv[i], NULL, 10);

    if(timelen > 0)
        sleep(timelen);

    return 0;
}

后来想想还是实现一个功能比较全的吧,代码如下。和标准linux sleep命令功能唯一不同的是:没有实现浮点数支持。


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。