关于c:程序人生-UNIX环境高级编程技巧之-du-指令实现

3次阅读

共计 1439 个字符,预计需要花费 4 分钟才能阅读完成。

本文首发于 2014-07-10 10:00:41

代码

#include <stdio.h>
#include <stdlib.h>
#include <glob.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define PATHSIZE 1024

static int path_noloop(const char *path)
{
    char *pos;

    pos = strrchr(path,'/');// 定位最左边的 '/' 的地位

    if(strcmp(pos+1,".") == 0 || (strcmp(pos+1,"..") == 0))
        return 0;
    return 1;

}

static int64_t mydu(const char *path)
{
    int i;
    glob_t globres;
    int64_t sum;
    static struct stat statres;
    static char nextpath[PATHSIZE];

    if(lstat(path, &statres) < 0)
    {perror("lstat()");
        return 0;//exit(1);
    }

    if(!S_ISDIR(statres.st_mode))
        return statres.st_blocks;

    strncpy(nextpath, path,PATHSIZE);
    strncat(nextpath, "/*" , PATHSIZE);
    glob(nextpath,GLOB_NOSORT, NULL, &globres);

    strncpy(nextpath, path,PATHSIZE);
    strncat(nextpath, "/.*" , PATHSIZE);
    glob(nextpath,GLOB_NOSORT|GLOB_APPEND, NULL, &globres);

    sum = statres.st_blocks;

    for(i = 0 ;i < globres.gl_pathc ; i++)
    {if(path_noloop(globres.gl_pathv[i]))
            sum += mydu(globres.gl_pathv[i]);
    }

    return sum;
}

int main(int argc,char **argv)
{if(argc < 2)
    {fprintf(stderr,"Usage...\n");
        exit(1);
    }
    printf("%lld 512B blocks\n", (long long int)mydu(argv[1]));
    return 0;
}

编译

$ gcc -g -Wall testdu.c -o testdu

运行

  • testdf 执行成果:
$ ./testdu /usr/bin
1766184 512B blocks
  • 原生 df 执行成果:
$ du -sh /usr/bin
859M    /usr/bin

欢送关注我的微信公众号【数据库内核】:分享支流开源数据库和存储引擎相干技术。

题目 网址
GitHub https://dbkernel.github.io
知乎 https://www.zhihu.com/people/…
思否(SegmentFault) https://segmentfault.com/u/db…
掘金 https://juejin.im/user/5e9d3e…
开源中国(oschina) https://my.oschina.net/dbkernel
博客园(cnblogs) https://www.cnblogs.com/dbkernel
正文完
 0