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.确定字符串长度 ...
随机推荐
- JAAS configuration for Kafka clients
Clients may configure JAAS using the client configuration property sasl.jaas.config or using the sta ...
- ajax 执行成功以后返回的数据走的是error方法而不是success方法的问题
今天在一个功能的时候发现写的ajax的方法执行后台代码成功后返回前台时执行的是error方法而不是success方法,代码如下 jQuery('#form').ajaxSubmit({ type: & ...
- 递归求兔子数列第n项的值
#include <iostream> using namespace std; int f(int n)//递归f数列的第n项 { ,y=,z; ||n==) { ; } else { ...
- ssh tunneling应用案例-AWS EC2 vnc图形化桌面的支持
一般地,无论是AWS EC2还是阿里云的云主机,linux系统默认都只提供ssh登录方式.如果你是一个技术控,非常希望把图形化界面给折腾出来,这其中就不需有vnc server的支持,除此之外,还涉及 ...
- Calendar类set方法中的坑
最近写了一个支付宝微信对账报表,发现系统金额比支付宝微信的少好多,左查右查发现是追缴金额没统计到,再一查发现月结束日期为2019-09-31,9月咋会有31,为啥呢就追缴金额不行呢,因为其他类型用TI ...
- ios、安卓前端兼容性
1.日期兼容性 解决方法(请看我上一篇文章)安卓.ios时间转换成时间戳的形式 2.input框聚焦,ios出现outline或者阴影,安卓显示正常 解决方法 input:focus{outline: ...
- ES6 之 对象的简写方式
简写有两条基本原则: 同名的属性可以省略不写 对象中的方法中的 : function 可以省略不写 来看下下面这个例子,我分别用ES5 和 ES6 的语法分别定义并声明了一个简单的学生对象: ES5: ...
- caffe库源码剖析——net层
net层的功能实现主要涉及到net.hpp和net.cpp文件,让我们要捋顺它是干了什么,是如何实现的. 1. net层使用到的参数 第一步要做的事,就是查看caffe.proto文件,弄清楚net都 ...
- tensorflow批量读取数据
Tensorflow 数据读取有三种方式: Preloaded data: 预加载数据,在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况). Feeding: Pyt ...
- Executors、ThreadPoolExecutor线程池讲解
官方+白话讲解Executors.ThreadPoolExecutor线程池使用 Executors:JDK给提供的线程工具类,静态方法构建线程池服务ExecutorService,也就是Thread ...