Linux C编程小例子——pwd命令的实现#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <pwd.h> ino_t get_inode(char *); void printpathto(ino_t); void inum_to_name(ino_t, char *, int);int main() { printpathto(get_inode(".")); /* print path to here */ putchar("
"); /* then add newline */ return 0; }/* * prints path leading down to an object with this inode * kind of recursive */ void printpathto(ino_t this_inode) { ino_t my_inode; char its_name[BUFSIZ]; if (get_inode("..") != this_inode) { chdir(".."); /* up one dir */ inum_to_name(this_inode, its_name, BUFSIZ);/* get its name*/ my_inode = get_inode("."); /* print head */ printpathto(my_inode); /* recursively */ printf("/%s", its_name); /* now print name of this */ } } void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen) { DIR *dir_ptr; /* the directory */ struct dirent *direntp; /* each entry */ dir_ptr = opendir("."); if (dir_ptr == NULL) { perror("."); exit(1); }/* search directory for a file with specified inum */ while ((direntp = readdir(dir_ptr)) != NULL) if (direntp->d_ino == inode_to_find) { strncpy(namebuf, direntp->d_name, buflen); namebuf[buflen - 1] = " "; /* just in case */ closedir(dir_ptr); return; } fprintf(stderr, "error looking for inum %d
", inode_to_find); exit(1);}/* * returns inode number of the file */ ino_t get_inode(char *fname) { struct stat info; if (stat(fname, &info) == -1) { fprintf(stderr, "Cannot stat "); perror(fname); return 1; } return info.st_ino; }