当前位置: 技术问答>linux和unix
unix环境高级编程里面第四章的程序,不知道是我敲错了,还是本来就有错
来源: 互联网 发布时间:2016-12-11
本文导语: unix环境高级编程里面第四章的程序,不知道是我敲错了,还是本来就有错,搞了好久。 不解一:fullpath这个变量自从分配以后就没有被修改过,每次调用dopath的时候该变量都是同一个 不解二:dopath里面的ptr变量有个...
unix环境高级编程里面第四章的程序,不知道是我敲错了,还是本来就有错,搞了好久。
不解一:fullpath这个变量自从分配以后就没有被修改过,每次调用dopath的时候该变量都是同一个
不解二:dopath里面的ptr变量有个鸟用?
不解三:这个程序怎么结束的,opendir,readir怎么连一个错都没有?
程序运行如下:
[yangguozheng@SWD160 apue]$ ls
a.out apue.2e apue.h changemod error.c filelink.c filetime.c mydir.c times
[yangguozheng@SWD160 apue]$ ls
a.out apue.2e apue.h changemod error.c filelink.c filetime.c mydir.c times
[yangguozheng@SWD160 apue]$ pwd
/home/yangguozheng/build/apue
[yangguozheng@SWD160 apue]$ ./a.out /home/yangguozheng/build/apue
FTW_D
dopath dirp->d_name:a.out
dopath dirp->d_name:apue.h
dopath dirp->d_name:times
dopath dirp->d_name:mydir.c
dopath dirp->d_name:error.c
dopath dirp->d_name:..
dopath dirp->d_name:filetime.c
dopath dirp->d_name:filelink.c
dopath dirp->d_name:changemod
dopath dirp->d_name:.
dopath dirp->d_name:apue.2e
regular files = 0, 0.00 %
directories = 1,100.00,%
block special = 0, 0.00,%
char special = 0, 0.00,%
FIFOs = 0, 0.00,%
symbolic links = 0, 0.00,%
socket = 0, 0.00,%
代码如下:
不解一:fullpath这个变量自从分配以后就没有被修改过,每次调用dopath的时候该变量都是同一个
不解二:dopath里面的ptr变量有个鸟用?
不解三:这个程序怎么结束的,opendir,readir怎么连一个错都没有?
程序运行如下:
[yangguozheng@SWD160 apue]$ ls
a.out apue.2e apue.h changemod error.c filelink.c filetime.c mydir.c times
[yangguozheng@SWD160 apue]$ ls
a.out apue.2e apue.h changemod error.c filelink.c filetime.c mydir.c times
[yangguozheng@SWD160 apue]$ pwd
/home/yangguozheng/build/apue
[yangguozheng@SWD160 apue]$ ./a.out /home/yangguozheng/build/apue
FTW_D
dopath dirp->d_name:a.out
dopath dirp->d_name:apue.h
dopath dirp->d_name:times
dopath dirp->d_name:mydir.c
dopath dirp->d_name:error.c
dopath dirp->d_name:..
dopath dirp->d_name:filetime.c
dopath dirp->d_name:filelink.c
dopath dirp->d_name:changemod
dopath dirp->d_name:.
dopath dirp->d_name:apue.2e
regular files = 0, 0.00 %
directories = 1,100.00,%
block special = 0, 0.00,%
char special = 0, 0.00,%
FIFOs = 0, 0.00,%
symbolic links = 0, 0.00,%
socket = 0, 0.00,%
代码如下:
#include "apue.h"
#include
#include
#define FTW_F 1
#define FTW_D 2
#define FTW_DNR 3
#define FTW_NS 4
typedef int Myfunc(const char *,const struct stat *,int);
static Myfunc myfunc;
static int myftw(char *,Myfunc *);
static int dopath(Myfunc *);
static long nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot;
char *path_alloc(int *size){
char *p = NULL;
if(!size) return NULL;
p = malloc(256);
if(p)
*size = 256;
else
*size = 0;
return p;
}
int main(int argc,char *argv[]){
int ret;
if(argc != 2)
err_quit("usage: ftw");
ret = myftw(argv[1],myfunc);
ntot =nreg + ndir + nblk + nchr + nfifo + nslink + nsock;
if(ntot == 0)
ntot = 1;
printf("regular files = %7ld,%5.2f %%n",nreg,nreg*100.0/ntot);
printf("directories = %7ld,%5.2f,%%n",ndir,ndir*100.0/ntot);
printf("block special = %7ld,%5.2f,%%n",nblk,nblk*100.0/ntot);
printf("char special = %7ld,%5.2f,%%n",nchr,nchr*100.0/ntot);
printf("FIFOs = %7ld,%5.2f,%%n",nfifo,nfifo*100.0/ntot);
printf("symbolic links =%7ld,%5.2f,%%n",nslink,nslink*100.0/ntot);
printf("socket = %7ld,%5.2f,%%n",nsock,nsock*100.0/ntot);
exit(ret);
}
static char *fullpath;
static int myftw(char *pathname,Myfunc *func){
int len;
fullpath = path_alloc(&len);
strncpy(fullpath,pathname,len);
fullpath[len-1]=0;
return (dopath(func));
}
static int dopath(Myfunc* func){
struct stat statbuf;
struct dirent *dirp;
DIR *dp;
int ret;
char *ptr;
if(lstat(fullpath,&statbuf) d_name);
if(strcmp(dirp->d_name,".") || strcmp(dirp->d_name,".."))
continue;
strcpy(ptr,dirp->d_name);
if((ret = dopath(func)) != 0)
break;
}
ptr[-1] = 0;
if(closedir(dp)st_mode & S_IFMT){
case S_IFREG: nreg++; break;
case S_IFBLK: nblk++; break;
case S_IFCHR: nchr++; break;
case S_IFIFO: nfifo++; break;
case S_IFLNK: nslink++; break;
case S_IFSOCK: nsock++; break;
case S_IFDIR:
err_dump("for S_IFDIR for %s",pathname);
}
break;
case FTW_D:
printf("FTW_Dn");
ndir++;
break;
case FTW_DNR:
printf("FTW_DNRn");
err_ret("can't read directory %s",pathname);
case FTW_NS:
printf("FTW_NSn");
err_ret("stat error for %s",pathname);
break;
default:
printf("defaultn");
err_dump("unknown type %d for pathname %s",type,pathname);
}
return 0;
}
|
一、fullpath所指向内存的内容,是通过dopath函数当中的ptr指针再次指向字符串的尾部再修改的;退出函数的时候,也通过ptr恢复了fullpath的内容。
打个比方,就是一个大屋子有两个门,不是只有正门才能进屋子搬东西的。
二、opendir,readdir返回值是结构体指针,当返回NULL的时候,就是结束或者出错。
打个比方,就是一个大屋子有两个门,不是只有正门才能进屋子搬东西的。
二、opendir,readdir返回值是结构体指针,当返回NULL的时候,就是结束或者出错。
|
APUE有代码可下载,你在LINUX环境下改改Makefile就可以编译,以运行结果为准。
对于比较晦涩生硬的代码,试着用gdb工具进行跟踪,可以理解过去不能理解的东西。
对于比较晦涩生硬的代码,试着用gdb工具进行跟踪,可以理解过去不能理解的东西。