# 20175201 реализация mypwd

Экспериментальные требования

学习pwd命令
研究pwd实现需要的系统调用(man -k; grep),写出伪代码
实现mypwd
测试mypwd

Научитесь PWD команды

  PWD является «Печать рабочего каталога» аббревиатура, его функция для отображения абсолютного пути к текущему рабочему каталогу. Ибо , когда пользователь не уверен в вашем местоположении , чтобы просмотреть текущий каталог по PWD командной абсолютный путь.
Использовать человек -k ключ командного обучения PWD

Первый входной терминал в -k человека PWD

Тогда в соответствии с выше строке введите человек PWD 1

Параметры:

-L: (логическое) показывает текущий путь, когда файл соединения, путь к файлу подключения непосредственно к дисплею, (в этом режиме по умолчанию, когда нет параметров)

-p: (физический) показывает текущий путь (физический путь), когда файл соединение, не используя путь соединения, файл отображается непосредственно связан с файлом , указанным
как PWD

Код работает результаты

код

//
//  main.c
//  pwd
//
//  Created by shadow on 2019/12/11.
//  Copyright © 2019 shadow. All rights reserved.
//

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

#define SIZE 128

ino_t get_inode(char *dirname);
void get_work_dir(ino_t inode_num);
void inode_to_dirname(ino_t inode_num, char *buf, int buflen);

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

ino_t get_inode(char *dirname)
{
    struct stat info;
    if (stat(dirname, &info) == -1)
    {
        perror("dirname");
        exit(1);
    }
    return info.st_ino;
}

void get_work_dir(ino_t inode_num)
{
    ino_t parent_inode;
    char buf[SIZE];
    if (get_inode("..") != inode_num)
    {
        chdir("..");
        inode_to_dirname(inode_num, buf, SIZE);
        parent_inode = get_inode(".");
        get_work_dir(parent_inode);
        printf("/%s", buf);
    }
}

void inode_to_dirname(ino_t inode_num, char *buf,int buflen)
{
    DIR *dir_ptr;
    struct dirent *dire;
    if ((dir_ptr = opendir(".")) == NULL)
    {
        perror(".");
        exit(1);
    }
    
    while ((dire = readdir(dir_ptr)) != NULL)
    {
        if (dire->d_ino == inode_num)
        {
            strncpy(buf, dire->d_name, buflen);
            buf[strlen(buf)] = '\0';
            closedir(dir_ptr);
            return ;
        }
    }
    fprintf(stderr, "error looking for inode number %d\n", (int)inode_num);
    exit(1);
}

рекомендация

отwww.cnblogs.com/20175201zc/p/12020275.html