自己动手写shell命令之pwd

思路:(1)得到"."的i节点号,称其为n(使用stat)

(2)chdir ..(使用chdir)

(3)找到inode号为n的节点,得到其文件名。

重复上述操作直到当前目录“.”的inode值等于".."的inode值

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

ino_t get_inode(char *);
void printpathto(ino_t);
void inum_to_name(ino_t ,char *,int);

int main()
{
	printpathto(get_inode("."));
	printf("\n");
	return 0;
}

ino_t get_inode(char * filename)
{
	struct stat buffer;
	if(lstat(filename,&buffer) == -1)
	{
		perror("can't stat");
		exit(1);
	}
	return buffer.st_ino;
}

void printpathto(ino_t ino)
{
	ino_t ino_parent = get_inode("..");
	if(ino_parent == ino)
		return;
	else
	{
		struct stat s;
		char buffer[255];
		chdir("..");
		inum_to_name(ino,buffer,255);
		printpathto(ino_parent);
		printf("/%s",buffer);
	}
}

void inum_to_name(ino_t ino,char * buffer,int buffer_length)
{
	DIR * dir;
	struct dirent * direntp;
	struct stat stat_buffer;
	dir = opendir(".");
	if(dir == NULL)
	{
		perror("can't open dir .");
		exit(1);
	}
	while((direntp = readdir(dir)) != NULL)
	{
		lstat(direntp->d_name,&stat_buffer);
		if(stat_buffer.st_ino == ino)
		{
			strncpy(buffer,direntp->d_name,buffer_length);
			buffer[buffer_length-1] = '\0';
			closedir(dir);
			return;
		}
	}
}
时间: 2024-11-06 20:17:36

自己动手写shell命令之pwd的相关文章

自己动手写shell命令之write

Linux下write命令允许用户跟其他终端上的用户对话.用c语言实现shell命令write,代码如下: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <utmp.h> #include <pwd.h> #include <sys/types.h> #include <stdlib.h> #include <sys/stat.h

自己动手写shell命令之ls -R1fF

ls命令的R参数代表递归的列出所有子文件夹中的所有文件,1表示每一行只显示一个文件或文件夹,f表示不排序即输出,F表示在每项的输出的最后根据其文件类型相应的加上*/=>@|字符.通过c语言实现ls -R1fF命令的效果,其源代码如下: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #in

自己动手写shell命令之du

du命令可以查看指定文件夹占用的磁块数,以下为linux下c语言实现shell du指令的代码(支持-k选项): #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> int disk_usage(char *); int k = 0; int main(int argc,char * argv

自己动手写shell命令之ls

linux下ls命令(支持-R參数)的c语言实现: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <string.h> void do_ls(char *); void do_stat(char *,char *);

自己动手写shell命令之who

思路:在unix系统中有一个名为utmp的文件,里面存着当前登录到系统中用户的信息.utmp这个文件里面保存的是结构数组,数组元素是utmp类型的结构.实现who命令,只要依次从utmp文件中读出utmp类型的结构体,然后通过合适的方式将它显示出来即可.如果每一次只从文件里面读一个结构体数据,那么每一个结构体都要进行依次系统调用.而又因为系统调用比较耗时(涉及到用户态到核心态的切换),所以这样会造成程序低效.我们使用缓冲技术,每次从文件中读若干结构体数据到内存中,当这些数据都已经显示在终端后,我

自己动手写shell命令之more

unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * file); int see_more(FILE * file); int main(int argc,char * argv[]) { FILE * fp; if(argc == 1) do_more(stdin); else { int argv_index = 1; while(argc > 1

自己写shell命令pwd

思维:(1)得到"."的i节点号,叫n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名称. 反复上述操作直到当前文件夹"."的inode值等于".."的inode值 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> ino_t

Linux Shell 学习笔记 二 Shell 命令行 pwd cd

今天开始Linx shell的第一篇 今天介绍 pwd和cd的使用方法. pwd的意思是“print working Directory”,显示用当前所在位置. pwd还有其他可用的参数 -L(大写),-P(大写) -L是显示当前用户的位置 和pwd相同 -P 显示用户当前物理位置 和pwd相同 其实直接用pwd就可以 cd 可以简单的认为目录切换 比如目前在/root/桌面,直接可以切换到/root/桌面/tools目录夹位置 和windows 下的cd命令类似 cd还有其他不同的用法 cd 

自己动手写shell之chgrp,chown,chmod

1.chgrp实现 #include <grp.h> #include <unistd.h> void chgrp(char * groupname,char * filename) { struct group * groupinfo = NULL; if((groupinfo = getgrnam(groupname)) == NULL) { printf("groupname does not exist\n"); return; } if(access(