问题描述
在存储空间有限的情况下,经常要对实时判断一个存储文件夹大小,现在用linux C编写一个线程函数,该线程能够实现循环查询某个存储文件夹的大小并通过终端打印出来,能够起到实时监控的作用。
解决方法
代码如下:
代码1:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <dirent.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include<stdlib.h>
void* limit_the_file_down_size(void* parameter);
int main()
{
pthread_t pid_Limit_the_file_down_size;
pthread_attr_t attr ;
pthread_attr_init(&attr); //故障线程属性初始化
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM); //定义为与系统中所有线程一起竞争CPU时间
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); //属性设置为分离状态
pthread_create(&pid_Limit_the_file_down_size,&attr,limit_the_file_down_size,NULL);
pthread_attr_destroy(&attr); //销毁线程
while(1)
{
sleep(5);
}
return EXIT_SUCCESS;
}
void* limit_the_file_down_size(void* parameter)
{
int status;
while(1)
{
if((status=system("du -sh /home/fip/test/"))<0)
{
printf("system error.\n");
exit(0);
}
sleep(1);
}
return NULL ;
}
编译并运行,观察终端打印显示文件夹大小
在监控过程中加入文件至文件夹,终端输出打印的文件夹大小数值改变
代码2:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <dirent.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include<stdlib.h>
#define file_down_path "/home/fip/test/"
void* limit_the_file_down_size(void* parameter);
int main()
{
pthread_t pid_Limit_the_file_down_size;
pthread_attr_t attr ;
pthread_attr_init (&attr); //故障线程属性初始化
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); //定义为与系统中所有线程一起竞争CPU时间
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); //属性设置为分离状态
pthread_create(&pid_Limit_the_file_down_size,&attr,limit_the_file_down_size,NULL);
pthread_attr_destroy(&attr); //销毁线程
while(1)
{
sleep(5);
}
return EXIT_SUCCESS;
}
void* limit_the_file_down_size(void* parameter)
{
while(1)
{
struct stat statbuff;
float filesize;
int sum(const char *fpath, const struct stat *sb, int typeflag)
{
filesize+= sb->st_size;
return 0;
}
ftw(file_down_path, &sum, 1);
filesize-=4096;减去文件夹自身大小
printf("!!!!test!!!! the_size_is %.3f KB\n",filesize/1000);
filesize=0;//将filesize置0,否则会累加
sleep(1);
}
return NULL ;
编译并运行,观察终端打印显示文件夹大小
在监控过程中加入文件至文件夹,终端输出打印的文件夹大小数值改变