Экспериментальные требования
学习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);
}