Міністерство освіти України
НУ “Львівська політехніка”
Кафедра ЕОМ
Звіт
про виконання лабораторної роботи №4
з дисципліни
“Проектування операційних систем, утиліт і драйверів”
Назва роботи:
“Системнй виклик stat”
Мета: Познайомитись і навчитися використовувати системні виклики stat, access, utime операційної системи Linux. Познайомитися з утилітою stat.
Призначення, синопсис та основні параметри утиліти та системних викликів
stat – вивести статус файлу чи файлової системи.
stat [OPTION] FILE...
-f, --filesystem - вивести статус файлової системи замість статусу файлу.
-c --format=FORMAT - використати специфікатор FORMAT.
-L, --dereference слідувати за посиланнями.
-t, --terse - друк інформації в стислій формі.
int stat(const char *file_name, struct stat *buf) – отримати інформацію про файл;
struct stat {
dev_t st_dev; /* пристрiй */
ino_t st_ino; /* номер inode */
mode_t st_mode; /* бiти повноважень */
nlink_t st_nlink; /* кiлькiсть hard-link'iв */
uid_t st_uid; /* iдентифiкатор власника файла */
gid_t st_gid; /* iдентифiкатор групи власникiв */
dev_t st_rdev; /* тип пристрою (якщо це inode пристрою) */
off_t st_size; /* розмiр файла, в байтах */
unsigned long st_blksize; /* розмiр блоку даної файлової системи */
unsigned long st_blocks; /* кiлькiсть видiлених блокiв */
time_t st_atime; /* час останнього доступу */
time_t st_mtime; /* час останньої модифiкацiї */
time_t st_ctime; /* час останньої змiни inode */
};
int access(const char *pathname, int mode) – інформація про тип доступу користувача до файлу;
int utime(const char *filename, struct utimbuf *buf) – зміна часу останнього доступу/модифікації файлу;
struct utimbuf {
time_t actime; /* час доступу */
time_t modtime; /* час модифікації */
};
Лістинг програми
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <utime.h>
#include <time.h>
#define USING "using: \"lab4 <file_name>\"\n"
#define ERROR "failed to read parameters of this file\n"
void demo_access(char *);
void demo_stat(char *);
void demo_utime(char *);
int main(int argc, char *argv[]) {
if(argc != 2) {
fprintf(stderr,USING);
exit(-1);
}
if(access(argv[1],0) == -1) {
fprintf(stderr,ERROR);
exit(-1);
}
demo_access(argv[1]);
demo_stat(argv[1]);
demo_utime(argv[1]);
puts("File status after reset create- and modification-time:");
demo_stat(argv[1]);
exit(0);
}
void demo_access(char *path) {
char yes[] = "yes", no[] = "no", *flag;
puts("system call \"accsess\":");
printf("The file %s:\n", path);
if(access(path,4) == 0) flag = yes;
else flag = no;
printf("\tread access:\t%s\n", flag);
if(access(path,2) == 0) flag = yes;
else flag = no;
printf("\twrite access:\t%s\n", flag);
if(access(path,1) == 0) flag = yes;
else flag = no;
printf("\texecute access:\t%s\n", flag);
putchar('\n');
}
void demo_stat(char *path) {
struct stat buf;
time_t t;
puts("system call \"stat\":");
printf("The file %s:\n",path);
stat(path,&buf);
printf("\tlength:\t\t\t%d\n", buf.st_size);
t = buf.st_atime;
printf("\tlast access:\t\t%s", ctime(&t));
t = buf.st_mtime;
printf("\tlast modification:\t%s", ctime(&t));
putchar('\n');
}
void demo_utime(char *path) {
struct utimbuf times;
times.actime = 0;
times.modtime = 0;
utime(path,×);
}
В дану програму необхідно передати із командної стрічки назву файлу, про який збирається інформація. Спочатку буде видана інформація про права доступу до файлу, отримана за допомогою системного виклику accsess(). Потім буде видана деяка інформація, отримана шляхом використання stat(). Після цього системним викликом utime() час останнього доступу до файлу та останньої його модифікації буде встановлений в нуль, і ще раз викликається stat(), щоби пересвідчитися в цьому.
Висновок
Під час виконання даної лабораторної роботи я ознайомився із системними викликами ОС Linux та утилітою stat, які дають змогу отримувати інформацію про файли.
Список літератури
Кейт Хевіленд, Дайна Грей, Бен Салама “Системное программирование в Unix”. Москва 2000.
Електронні ресурси кафедри ЕОМ.