- 论坛徽章:
- 2
|
这是我照着一本书上的思路,自己写了个统计一个目录下文件的类型和数量的小程序,但是运行时
出现错误double free or corruption,出错的地方在
// if(closedir(dp)<0)
// printf("can not close the directory %s",pathname);
// 这个地方是不是会产生递归调用多次的情况?
//if(dirp==NULL)
// closedir(dp);
这是关闭dp的两种写法,都会出错,只要不进行关闭,程序没有问题.
我本来感觉是由于递归产生了多次关闭,导致的错误,于是就改成了蓝字的写法,但是还是一样的错误,哪位大哥给指点下!!非常感谢!
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
static int nreg,ndir,nblk,nfifo,nalink,nsock,ntot;
static char *pathname;
int do_dir()
{
struct stat statbuf;
struct dirent *dirp;
DIR *dp;
int ret;
char *ptr;
if(lstat(pathname,&statbuf)<0)
perror("stat error");
// printf("after lstat %s",pathname);
if(S_ISDIR(statbuf.st_mode)==0)
{
printf("this is a file %s\n",pathname);
switch(statbuf.st_mode&S_IFMT)
{
case S_IFREG:
nreg++;break;
case S_IFBLK:
nblk++;break;
case S_IFIFO:
nfifo++;break;
case S_IFLNK:
nalink++;break;
case S_IFSOCK:
nsock++;break;
default:
printf("unknown file type!\n");
}
printf("%d %d %d %d %d \n",nreg,nblk,nfifo,nalink,nsock);
return 0;
}
ptr = pathname + strlen(pathname);
*ptr++ = '/';
*ptr = 0;
ndir++;
if((dp=opendir(pathname))==NULL)
perror("opendir error");
while((dirp=readdir(dp))!=NULL)
{
if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0)
continue;
strcpy(ptr,dirp->d_name);
printf("%s\n",pathname);
ret = do_dir();
}
ptr[-1]=0;//what's meanning?
// if(closedir(dp)<0)
// printf("can not close the directory %s",pathname);
// 这个地方会产生递归调用多次的情况,应在只是在最后一次的时候关闭closedir
//if(dirp==NULL)
// closedir(dp);
return ret;
}
int pre_handling(char *path)
{
int ret;
int length = strlen(path);
pathname = malloc(length+1);
strcpy(pathname,path);
pathname[length]=0;
printf("current path handling = %s\n",path);
ret = do_dir();
return ret;
}
void display()
{
if((ntot=nreg+ndir+nblk+nfifo+nalink+nsock)==0)
ntot=1;
printf("regular file = %7d,%5.2f\n",nreg,100.0*nreg/ntot);
printf("dictionary file = %7d,%5.2f\n",ndir,100.0*ndir/ntot);
printf("block file = %7d,%5.2f\n",nblk,100.0*nblk/ntot);
printf("fifo file = %7d,%5.2f\n",nfifo,100.0*nfifo/ntot);
printf("link file = %7d,%5.2f\n",nalink,100.0*nalink/ntot);
printf("nsock file = %7d,%5.2f\n",nsock,100.0*nsock/ntot);
}
int main(int argc,char *argv[])
{
int ret;
if(argc!=2)
perror("patameters not match\n");
ret = pre_handling(argv[1]);
display();
return 0;
} |
|