手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux C编程小例子——pwd命令的实现

[日期:2014-01-01] 来源:Linux社区  作者:caihongshijie6 [字体: ]

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('\n'); /* 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] = '\0'; /* just in case */
   closedir(dir_ptr);
   return;
  }
 fprintf(stderr, "error looking for inum %d\n", 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;
}

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款