当前位置:  技术问答>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,%

代码如下:

#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的时候,就是结束或者出错。

|
APUE有代码可下载,你在LINUX环境下改改Makefile就可以编译,以运行结果为准。
对于比较晦涩生硬的代码,试着用gdb工具进行跟踪,可以理解过去不能理解的东西。

    
 
 

您可能感兴趣的文章:

  • UNIX环境高级编程第四章的一个程序例子里面的指针存储字符串问题
  • 高级UNIX编程和UNIX环境高级编程是不是一本书
  • 读过 Unix网络编程 或者 熟知Unix网络编程的 的进来看一下
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 我下载了UNIX环境高级编程的源码,可是打开时有错误,怎么才可以打开?还有谁有《UNIX环境高级编程(英文版)》的chm格式的ebook?
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • 想学linux下程序开发,不知道买哪本书好《UNIX环境高级编程》(中文第一版)还是《UNIX环境高级编程》(英文第二版)
  • unix编程与linux编程有什么区别?
  • [学习UNIX编程]初学UNIX编程,遇到一个小小的问题,烦劳大虾帮忙解惑,谢谢!
  • 看Unix环境高级编程,提到了V和bsd,有很多不同,但是没有提到Linux,请问linux跟BSD或者unix V 编程细节哪些不同的,特别是线程,进程,和socke
  • 都说《UNIX环境高级编程》好,对于学linux编程好不好?《Linux下的c编程》《嵌入式系统C编程》那个更适合初学者?各是那个出版社的?(
  • 我初学 Unix 编程,在看《Unix环境高级编程》时有一个问题请指教。
  • 我学&用Linux编程,手里有《UNIX环境高级编程》,看它行吗?
  • 谁有介绍UNIX下面函数的书啊,类似UNIX编程参考手册的东西
  • UNIX编程艺术,了解unix文化强烈推荐这本书
  • UP有分,推荐几本书给我吧,兄弟们,UNIX入门与编程的与编程的,
  • 学Linux编程前要学Unix吗?哪里有学Linux编程的好书下载?
  • 入门问题,我想向UNIX编程方向发展,单目前不会UNIX,我该如何做
  • 请问:如果懂unix编程,那么会懂linux编程吗?一般来说:它们有什么关系呢?
  • 都说《UNIX环境高级编程》好,对于学linux编程好不好?是那个出版社的,是中文版吗?
  • 学习UNIX编程应该从那里入手?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 因进修,需要学习《Unix 环境高级编程》一书,完全没接触过Unix/Linux,请推荐一个学习环境。
  • 急,《UNIX环境高级编程》中6.9 环境变量T Z是什么?
  • Java在unix环境下的应用?急、急、急...
  • 关于UNIX下的环境变量的设定
  • unix环境高级编程 VS linux程序设计,买哪本?
  • unix环境高级编程
  • 各位大侠,请推荐几本在UNIX环境下使用标准C语言编程的好书.谢谢啊!!!
  • 有没有什么工具可以在windows环境下生成unix用的.so文件
  • 在SCO UNIX 5。0。5下,如何安装C编译环境?
  • 大家好!如何在UNIX环境下建立WEB服务器?用什么软件?
  • <unix环境高级编程>该怎么看?
  • 试过《Unix环境高级编程》里的程序的请进
  • UNIX rc3.d 启动的服务,环境变量不正确
  • SunUnix 和 sco unix 的编程环境一样吗?
  • 我有个问题. UNIX环境生成报表,由命令行打印,
  • Unix环境的编程中,“高级功能”用到的多不?
  • 关于Bochs-2.0.2(UNIX模拟环境),价格100分
  • 在UNIX/C环境下怎么定时启动一个函数?
  • 哪有 UNIX环境高级编程 第2版 源代码 ????(急急~~~~)
  • 网页版Unix操作系统环境
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • unix/Linux下c++ boost thread库读写锁介绍
  • 没有unix系统我如何学习unix
  • 请问:如果懂unix编程,那么会懂linux编程吗?一般来说:它们有什么关系呢? iis7站长之家
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • php将unix时间戳转换成字符串时间函数(date)
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • UNIX特急!!!digital unix问题,请专家快来!!!
  • UNIX支持中文否,请推荐UNIX好书


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3