linux下实现简易pwd命令

/*
    pwd 命令
    路径名通过栈存储,先入栈存储,再出栈输出
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#define NUM 40
/*
    定义节点
*/
struct node {
    char name[NUM];
    struct node *pre;
};
/*
    定义栈
*/
struct stack {
    int num;
    struct node* top;
};
/*
    入栈 c1为入栈元素
*/
void push(struct stack* s1, char *c1)
{
    struct node *n;
    n = (struct node *)malloc(sizeof(struct node));
    if (n == NULL) {
        perror("malloc error");
        exit(1);
    }
    strcpy(n->name, c1);
    if (s1->num == 0) 
        n->pre = NULL;
    else 
        n->pre = s1->top;
    s1->num++;
    s1->top =n;
}
/*
    出栈 出栈元素存储在c1中
*/
void *pop(struct stack *s1, char* c1)
{
    struct node *n;
    if (s1->num == 0)
        return NULL;    
    n = s1->top;
    strcpy(c1, n->name);
    s1->top = s1->top->pre;
    s1->num--;
    free(n);
}
/*
    输出路径名
*/
void output(struct stack *s1)
{
    char name[NUM];
    while (s1->num >0) {
        pop(s1, name);
        /*在每个路径名前加"/",本程序只存储到根目录的下层目录,若在/home/abc下运行
        栈内元素由上到下为 abc home
        输出后为/home/abc
          */
        printf("/%s", name);
    }
    printf("\n");
}

int main(void)
{
    DIR *d;
    struct dirent *dir;
    struct stack *s1;
    //node存当前节点inode, fnode存父目录inode
    int node;
    int fnode;

    s1->num = 0;
    s1->top = NULL;
    if ((d = opendir(".")) == NULL )
        perror("open error");
    while ((dir = readdir(d)) != NULL)
        if (!strcmp(".", dir->d_name)) {
            node = dir->d_ino;
            break;
        }
    closedir(d);
    while (1) {
        if (chdir("..") == -1) {
            perror("chdir error");
            exit(1);
        }
        if ((d = opendir(".")) == NULL) {
            perror("open error");
            exit(1);
        }
        while ((dir = readdir(d)) != NULL)
            if (dir->d_ino == node) {
                push(s1, dir->d_name);
                break;
            }
        rewinddir(d);
        while ((dir = readdir(d)) != NULL) {
            if (!strcmp(".", dir->d_name)) 
                node = dir->d_ino;
            if (!strcmp("..", dir->d_name))
                fnode = dir->d_ino;
        }
        if (node == fnode)
            break;
        closedir(d);
    }
    output(s1);
}

总结:

1、POSIX提供了获取当前路径的函数:

#include <unistd.h>
char *getcwd(char *buf, size_t size);

2、当前目录问题

例如,可执行文件放在/home/abc/123下,名为pwd

当前目录为/home/abc

此时若执行文件需要输入:123/pwd

而输出为/home/abd 而不是/home/abc/123

则当前目录为运行程序的目录,而不是文件所在位置。

3、

 while ((dir = readdir(d)) != NULL)
            if (dir->d_ino == node) {
                push(s1, dir->d_name);
                break;
            }
        rewinddir(d);
        while ((dir = readdir(d)) != NULL) {
            if (!strcmp(".", dir->d_name)) 
                node = dir->d_ino;
            if (!strcmp("..", dir->d_name))
                fnode = dir->d_ino;
        }

此处需要便利目录两次,开始设计算法时,将两次遍历放在了一次里面,这样导致了node参数发生变化,逻辑出现问题

浪费了大量时间

时间: 2024-10-13 12:06:32

linux下实现简易pwd命令的相关文章

linux下实现简易ll命令

/*     实现ll命令,输出指定目录下详细信息     格式:ll -l dirname     目录采用快速排序,按字典顺序排序 */ #include <stdio.h> #include <dirent.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> #include <time.h> #include <grp.h> #inclu

20145239 Linux下常用的ls命令总结

20145239 Linux下常用的ls命令总结 通过学习本周的教学视频和要求掌握的内容,发现ls命令被使用的次数非常多,但作为一个初学者,可能我只会ls或者顶多ls -l两种用法.但其实ls是一个非常实用的指令,因此我想简单的总结一下ls的常用命令. ls,英文全名:list 即列表的意思. 常用命令(以本周的10io文件夹为例): 1. ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录). 2. ls

linux下如何使用sftp命令【转】

linux下如何使用sftp命令 from:   http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP 是 202.206.64.33或者是域名www.hebust.edu.cn,用户名是  fyt ,在命令行模式下:

Linux下su与su -命令的区别

在启动服务器ntpd服务时遇到一个问题 使用 su root 切换到root用户后,不可以使用service命令: 使用 su - 后,就可以使用service命令了. 原因: su命令和su -命令区别就是: su只是切换了root身份,但Shell环境仍然是普通用户的Shell:而su -连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误,报command not found的错误. su切换成root用户以后,pwd一下,发现工作目录仍然

linux下oralcle11g使用edit命令默认调用vi编辑器

linux下oralcle11g使用edit命令默认调用vi编辑器: 在        $ORACLE_HOME/sqlplus/admin/glogin.sql   最后一行添加   define_editor=vi  即可. linux下oralcle11g使用edit命令默认调用vi编辑器,布布扣,bubuko.com

Linux下静态路由配置命令

linux下静态路由修改命令 方法一: 添加路由 route add -net 192.168.1.0/24 gw 192.168.1.1 route add -host 192.168.1.8 dev 192.168.1.1 删除路由 route del -net 192.168.0.0/24 gw 192.168.0.1 add 增加路由 del 删除路由 -net 设置到某个网段的路由 -host 设置到某台主机的路由 gw 出口网关 IP地址 dev 出口网关 物理设备名 增加默认路由

Linux下那些奇葩的命令

相信喜爱编程,痴迷技术的你,肯定接触过甚至深爱着linux,甚至可能已经非常熟悉linux了,但是linux那逗比的一面,你又知道多少. 本文!纯粹娱乐!不喜勿喷! 1.程序员的愤怒! yes 当我们再终端输入yes命令,你就回看到愤怒地y怒刷屏! 2.小火车sl 我相信ls你每天输入无数次,但是sl你又知道不知道? 我们需要安装一下 sudo yum install sl ubuntu用户: sudo apt-get install sl 之后,再输入sl命令,哈哈,看到小火车没有! 3.无聊

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: 1 /************************************************************************* 2 > File Name: dirwalk.c 3 > Author: 4 > Mail: 5 > Created Time: Tue 31 Mar 2015 11:56:38 AM CST 6 ******************

linux下的性能查询命令

(1)查看各个CPU核的使用情况 sudo top -d 1 进入之后,按1,会出现下面的CPU使用情况,其中us列反映了各个CPU核的使用情况,百分比大说明该核在进行紧张的任务. (2)查看哪个进程在哪个CPU核上运行 sudo top -d 1 进入之后,依次按f.j和空格,会出现如下(其中P列指示的是该进程最近使用的CPU核,如进程mencoder的P列为7,则表示mencoder最近在核7上运行,对于多线程甚至单线程的进程,在不同时刻会使用不同的CPU Core): (3)vmstat查