pwd函数实现
/*
* 文件名:mypwd.c
* 描述: 实现简单的pwd命令
*/
#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<unistd.h> #define MAX_DIR_DEPTH (256) //根据文件名获取文件inode-number
ino_t get_ino_byname(char *filename)
{
struct stat file_stat;
if ( != stat(filename, &file_stat))
{
perror("stat");
exit(-);
} return file_stat.st_ino;
} //根据inode-number,在当前目录下查找对应的文件名
char *find_name_byino(ino_t ino)
{
DIR *dp = NULL;
struct dirent *dptr = NULL;
char *filename = NULL; if (NULL == (dp = opendir(".")))
{
fprintf(stderr,"Can not open Current Directiory\n");
exit(-);
}
else
{
while (NULL != (dptr = readdir(dp)))
{
if (dptr->d_ino == ino)
{
filename = strdup(dptr->d_name);
break;
}
}
closedir(dp);
}
return filename;
} int main()
{
//记录目录名的栈
char *dir_stack[MAX_DIR_DEPTH];
int current_depth = ; for(;;)
{
/*1.通过特殊的文件名“.”获取当前目录的inode-number*/
ino_t current_ino = get_ino_byname("."); /*2.通过特殊的文件名“..”获取当前目录的父级目录的inode-number*/
ino_t parent_ino = get_ino_byname(".."); /*3.判断当前目录和上级目录的inode-number是否一样*/
/*4.如果两个inode-number一样说明到达根目录*/
if (current_ino == parent_ino)
{
break;
} /*
5.如果两个inode-number不一样
切换至父级目录,根据步骤1获取的inode-number,
在父级目录中搜索对应的文件名并记录下来, 重新回到步骤1
*/
chdir("..");
dir_stack[current_depth++] = find_name_byino(current_ino); /*输出完整路径名*/
if (current_depth >= MAX_DIR_DEPTH)
{
fprintf(stderr,"Directory tree is too deep.\n");
exit(-);
}
} int i = current_depth - ;
for ( i = current_depth - ; i >= ; i--)
{
fprintf(stdout,"/%s",dir_stack[i]);
free(dir_stack[i]);
} fprintf(stdout,"%s\n",current_depth == ? "/":""); return ;
}
strdup()函数
函数和功能描述:
extern char *strdup(char *s);
头文件:string.h
功能: 将串拷贝到新建的位置处
说 明:strdup不是标准的c函数。strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。
返回值:返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。
/*
strdup.c
*/
#include<stdlib.h>
#include<stdio.h>
#include<string.h> int main()
{
char *s = "God is a girl";
char *d; d = strdup(s);
printf("%s",d); free(d); return ;
}
pwd函数实现的更多相关文章
- shell_basic
1.回顾基础命令 2.脚本 3.变量 4.别名 5.条件判断 6.test判断 一.回顾基础命令 shutdown --关机/重启 exit --退出当前shell rmdir --删除空目录 d ...
- [z]【Bash命令行处理】[详解]
(转自:http://www.linuxsir.org/bbs/thread99465.html) 我看很多兄弟写脚本或命令时出现错误的主要原因,是因为不了解bash的命令行处理.我在这里总结了一下, ...
- shell中eval的使用问题
转载:http://www.blogjava.net/jasmine214--love/archive/2010/11/26/339106.html 本文将会讲解一些linux中命令的使用与技巧希望对 ...
- [C语言] 获得 pwd 的几种函数
_getcwd() GetCurrentDirectory GetModuleFileName main函数参数 argv[0] // crt_getcwd.c // This program pla ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- 跟着老男孩教育学Python开发【第三篇】:Python函数
set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail(): import smtpl ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
- SQLserver中用convert函数转换日期格式
SQLserver中用convert函数转换日期格式 2008-01-23 15:47 SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用con ...
- php常用字符串函数小结
php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...
随机推荐
- bootstrap-switch使用,small、mini设置
1.首先需要引用https://www.bootcss.com/p/bootstrap-switch/. bootstrap-switch插件库 2.先引用jquery文件,在引用bootstrap. ...
- Java自学-数字与字符串 比较字符串
Java 比较字符串 示例 1 : 是否是同一个对象 str1和str2的内容一定是一样的! 但是,并不是同一个字符串对象 package character; public class TestSt ...
- 使用别的电脑连接另一台电脑当中的虚拟机中的kylin项目
环境说明: 本机A的ip:192.168.0.242 服务器B的ip:192.168.0.125 服务器上的虚拟机C的ip:192.168.43.129 目前状态: B上面能访问C上的站点kylin站 ...
- Redis分布式锁原理
1. Redis分布式锁原理 1.1. Redisson 现在最流行的redis分布式锁就是Redisson了,来看看它的底层原理就了解redis是如何使用分布式锁的了 1.2. 原理分析 分布式锁要 ...
- 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装
WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...
- 2. vue基础-vue-cli(vue脚手架)
1. 作用 快速创建一个基于webpack模板的项目 2. 安装工具 安装webpack:使用npm全局安装webpack,打开命令行工具,输入 npm install webpack -g,安装 ...
- Android中自定义环形图2
如图: 自定义属性,在values文件夹下创建 attrs.xml <?xml version="1.0" encoding="utf-8"?> & ...
- python工程化最佳实践
1.pipenv 真实环境 vs virtualenv vs pipenv 2.自定义用户模型 继承BaseUserManager和AbstractBaseUser,在settings中指定AUTH_ ...
- Centos7下的日志切割--转发
logrotate /etc/logrotate.conf 是 Logrotate 工具的一个配置文件,这个工具用来自动切割系统日志,Logrotate 是基于 cron 来运行的,如下: [root ...
- python应用-彩票随机码的输出
""" 双色球-6个红色球(1-33)和一个蓝色球(1-16) """ from random import randint def sel ...