zoukankan      html  css  js  c++  java
  • 随手写个pwd命令

    首先声明,这是《Unix/Linux编程实践教程》书上第4章的一个例子,用以说明chdir命令的使用,以及相关的文件系统内容。网上关于这个代码例子的网页(写在博客上的,百度知道什么的)很多。

    根据书上给的思路,写了个和书上代码差不多的。

    #include<stdio.h>
    #include
    <string.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<dirent.h> #include<stdlib.h> #include<errno.h> #define MAX_SIZE 256 void do_pwd(char*); int get_inode(char *path) { struct stat info; int inode; if(stat(path,&info)==-1){ perror("get inode error"); exit(errno); } inode = info.st_ino; return inode; } void get_name_inode(char name[], int inode) { DIR *dir_ptr; struct dirent *ptr; if((dir_ptr = opendir("."))==NULL){ perror("dir open error"); exit(errno); } while((ptr = readdir(dir_ptr))!=NULL){ if(ptr->d_ino==inode){ strcpy(name,ptr->d_name); break; } } closedir(dir_ptr); return; } int main(int argc, char *argv[]) { do_pwd("."); printf("\n"); return 0; } void do_pwd(char *path) { int flag=0; char name[MAX_SIZE]; int inode=get_inode(path); if(inode!=get_inode("..")){ chdir(".."); get_name_inode(name,inode); do_pwd("."); printf("/%s",name); }return; }

    因为用的是书上的思路,书上例子有的问题,这段代码也一样有。具体就是,当系统不是挂载在一个分区的时候,这个程序只能显示到当前分区的根部,即挂载点,而不能继续向上访问另外分区的目录。举例来说,在我的系统中,/分区和/home分区挂载在不同的硬盘分区上,那么这个程序就只能显示到username这一级而不能显示/home。

    然后,就想去找gnu的pwd命令实现。根据pwd命令的man手册,pwd命令在coreutils包中。去网站上下了个包,看pwd.c的源码,有300多行,编译了用gdb单步跟了一下,发现代码逻辑主要就几行。最主要的就是调用xgetcwd函数。这个函数在源码文件的lib目录中的xgetcwd.h中声明,定义在相应的.c文件中,就几行,调用了一下getcwd函数,然后返回。

    于是,一个功能可用的简单pwd就像下面这样:

    #include<stdio.h>
    #include<unistd.h>
    
    int main(int argc, char *argv[])
    {
         printf("%s\n",getcwd(NULL, 0));
         return 0;
    }

    编译、运行。显示正确。

    ~EOF~
  • 相关阅读:
    bug排查
    做接口测试没反应
    wcf配置文件
    mvc学习-编辑提交需要注意-mvc重点
    大批量导出思路
    进程基础知识
    (转)JMS事务
    (转)JMS简明学习教程
    (转)Linux下使用system()函数一定要谨慎
    LInux文件基础知识和文件目录操作(二)文件I/O操作
  • 原文地址:https://www.cnblogs.com/fityme/p/3050068.html
Copyright © 2011-2022 走看看