• 随手写个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~
  • 相关阅读:
    Windows平台下Glade+GTK开发环境的搭建
    uCOSII移植STM32F10x_Keil
    C语言中的内存管理与双向链表
    Windows平台下Glade+GTK实现多线程界面的探讨
    C语言中可变形参个数的函数实现
    从STM32的位带操作重谈嵌入式中寻址与对齐的理解
    uCOSII的中断ARM7实现中断嵌套的方法探究
    uCOSII中的内存管理C语言构建完整的微型动态内存管理机制
    uCOSII中的任务切换图解多种任务调度时机与问题
    uCOSII中的任务切换机制
  • 原文地址:https://www.cnblogs.com/fityme/p/3050068.html
Copyright © 2020-2023  润新知