Модуль 9. Информация о файле или каталоге
Не смотря на довольно таки массивный код, процедура проста.
#include <cstdlib>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "stfile.h"
#include "err1.h"
using namespace std;
void statfile(char *path)
{
struct stat sb;
if(stat(path,&sb)==-1)
err1();
else
{
printf("File type: "):
switch (sb.st_mode & S_IFMT)
{
case S_IFBLK: cout<<" block device\n"; break;
case S_IFCHR: cout<<''character device\n"; break;
case S_IFDIR: cout<<"directory\n"; break;
case S_IFIFO: cout<<"FIFO/pipe \ n "; break;
case S_IFLNK: cout<<"symlink\n"; break;
case S_IFREG: cout<<"regularfile\n"; break;
case S_IFSOCK: cout<<"socket\n"; break;
default: cout<<"unknown?\n"; break;
}
printf("i-node number: %ld\n", (long) sb.st_ino);
printf(“Mode: %lo(octal)\n",
(unsigned long) sb.st_mode);
if(sb.st_mode & S_IRUSR) cout<<" owner has read permission\n";
if(sb.st_mode & S_IWUSR) cout<<" owner has write permission\n";
if(sb.st_mode & S_IXUSR & !S_IFDIR) cout<<"owner has execute permission\n";
if(sb.st__mode & S_IRGRP) cout<<"group has read permission\n";
if(sb.st_mode & S_IWGRP) cout<<"group has write permission\n";
if(sb.st_mode & S_IXGRP & !S_IFDIR) cout<<"group has execute permission\n";
if(sb.st_mode & S_IROTH) cout<<"others have read permission\n";
if(sb.st_mode & S_IWOTH) cout<<"others have write permission\n";
if(sb.st_mode & S_IXOTH & !S_IFDIR) cout<<"others have execute permission\n";
Далее следует правильно вывести на экран результаты анализа свойств файла (каталога).
printf("Link count: %ld\n", (long) sb.st_nlink);
printf("Ownership: UID=%ld GID=%ld\n",
(long) sb.st_uid, (long) sb.st_gid);
printf(“Preferred I/O block size: %ld bytes\n",
(long) sb.st_blksize);1
printf(" File size: %lld bytes\n",
|
|
(long long) sb.st_size);
printf(" Blocks allocated: %lld\n",
(long long) sb.st_blocks);
Единственное, что необходимо знать для понимания данной процедуры - функция stat
int stat(const char *file_name, struct stat *buf);
Эти функции возвращают информацию об указанном файле. Для этого не требуется иметь права доступа к файлу, хотя потребуются права поиска во всех каталогах, указанных в полном имени файла.
stat возвращает информацию о файле file _ name и заполняет
буфер buf . Istat идентична stat, но в случае символьных ссылок она возвращает информацию о самой ссылке, а не о файле, на который она указывает, fstat идентична stat, только возвращается информация об открытом файле, на который указывает filedes (возвращаемый оре n (2)), а не o file _ name.
Все эти функции возвращают структуру stat, которая содержит следующие поля:
struct stat {
dev_t st_dev; /* устройство */
ino_t st_ino; /* inode */
mode_t st_mode; /* режим доступа */
nlink_t st_nlink; /* количество жестких ссылок */
uid_t st_uid; /* идентификатор пользователя-владельца */
gid_t st_gid; /* идентификатор группы-владельца*/
dev_t st_rdev; /* тип устройства */
/* (если это устройство) */
off_t st_size; /* общий размер в байтах */
blksize_t st_blksize; /* размер блока ввода-вывода */
|
|
/* в файловой системе */
blkcnt_t st_blocks; /* количество выделенных блоков */
time_t st_atime; /* время последнего доступа */
time_t st_mtime; /* время последней модификации */
time_t st_ctime; /* время последнего изменения */
Поле st _ size задает размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки - длина пути файла на который она cсылается, без конечного NUL.
ЗАКЛЮЧЕНИЕ
Мы попытались создать простейшую системную оболочку. Нам удалось организовать не так уж и мало модулей для работы с файлами и каталогами, которых будет вполне достаточно для работы. Конечно, наш вариант системный оболочки во многом уступает профессиональным средствам. Наш вариант системной оболочки нуждается во многих вещах, например
• Оптимизация
• Дополнение для работы с каталогами
• Создание нормального командного интерпретатора
Но, основная цель- понимание работы системной оболочки.
Дата добавления: 2019-03-09; просмотров: 240; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!