Файлова система UNIX: індексні дескриптори

У цьому розділі будуть розглянуті системні виклики, що мають справу з файловою системою і, зокрема, з інформацією про файли, такий як розмір, дати, права доступу і т д Ці системні виклики дають доступ до всієї тієї інформації, яку ми обговорювали в главі 2

Давайте тепер звернемося власне до індексним дескрипторах

Частина їх описується структурою stat, яка визначається в sys / stath:

struct stat / * структура, яка повертається stat * /

{

dev_t

st_dev

/ * Пристрій індексного дескриптора * /

ino_t

st_ino

/ * Номер індексного дескриптора * /

short

st_mode

/ * Біти доступу * /

short

st_nlink

/ * Кількість посилань на файл * /

short

st_uid

/ * Ідентифікатор власника * /

short

st_gid

/ * Ідентифікатор групи власника * /

dev_t

st_rdev

/ * Для спеціальних файлів * /

off_t

st_size

/ * Розмір файлу в символах * /

time_t

st_atime

/ * Час останнього читання з файлу * /

time_t

st_mtime

/ * Час останнього запису або створення файлу * /

time_t

st_ctime

/ * Час останньої зміни файлу або індексного

дескриптора * /

}

Більшість полів описано в коментарях Такі типи, як dev_t і ino_t, визначені в sys / typesh, це обговорювалося в попередніх розділах Елемент st_mode містить набір прапорів, що описують файл для зручності прапори визначені також у файлі sys / stath:

# Define S_IFMT 0170000 / * тип файлу * /

# Define S_IFDIR 0040000 / * каталог * /

# Define S_IFCHR 0020000 / * спеціальний символьний * /

# Define S_IFBLK 0060000 / * спеціальний блоковий * /

# Define S_IFREG 0100000 / * звичайний * /

# Define S_ISUID 0004000 / * при запуску встановити ефективний ідентифікатор користувача як у власника * /

використання * /

# Define S_IREAD 0000400 / * права на читання, власник * /

# Define S_IWRITE 0000200 / * права на запис, власник * /

# Define S_IEXEC 0000100 / * права на виконання / пошук, власник * /

Доступ до індексному дескриптору файлу виконується за допомогою двох системних викликів: stat і fstat Виклик stat приймає імя фай ла і повертає інформацію індексного дескриптора для цього фай ла (або -1 У разі помилки), fstat робить те ж саме з файлового дескриптора для відкритого файлу (не з покажчика FILE) Таким чином,

char  *name int fd

struct stat stbuf

stat(name,  &ampstbuf) fstat(fd,  &ampstbuf)

Структура stbuf заповнюється інформацією з індексного дескриптора для файлу з імям name або дескриптором fd

Тепер, коли ми маємо в своєму розпорядженні усіма цими фактами, спробуємо написати якийсь корисний код Почнемо з того, що напишемо на мові Сі програму checkmail, яка спостерігатиме за поштовою скринькою користувача Якщо файл збільшується в розмірі, програма пише You have mail і подає звуковий сигнал (Якщо файл стає менше, це, мабуть, тому, що ви тільки що прочитали і видалили якесь пись мо, повідомлення не потрібні) Для першого кроку цього цілком достатньо коли ця програма запрацює, можна буде її вдосконалити

/ * Checkmail: стежить за поштовою скринькою користувача * /

#include &ltstdioh&gt

#include &ltsys/typesh&gt

#include  &ltsys/stath&gt char  *progname

char * maildir = / usr / spool / mail; / * Залежить від системи * /

main(argc,  argv) int  argc

char  *argv[]

{

struct stat buf

char  *name,  *getlogin() int  lastsize  =  0

progname = argv[0]

if ((name  = getlogin())  == NULL)

error(&quotcant  get  login name&quot, (char *)  0) if  (chdir(maildir)  ==  –1)

error(&quotcant  cd  to  %s&quot,  maildir) for  (;)  {

if (stat (name, & buf) == -1) / * немає поштової скриньки * / bufst_size = 0

if (bufst_size &gt lastsize)

fprintf(stderr,  &quot\nYou  have  mail\007\n&quot) lastsize =  bufst_size

sleep(60)

}

}

Функція getlogin (3) повертає імя, з яким зареєстрований користувач, або NULL, якщо імя не отримано Системний виклик chdir переводить checkmail в поштову каталог, так що наступним виклику вам stat не доводиться переглядати кожен каталог, починаючи з кореневого і закінчуючи поштовим У вашій системі, може бути, при дется змінити значення maildir Програма checkmail написана так, щоб спроби робилися навіть у тому випадку, коли поштовий ящик не існує, оскільки більшість поштових програм видаляють поштову скриньку, якщо він порожній

Ця програма була представлена ​​в розділі 5 для ілюстрації циклів оболонки Та версія створювала кілька процесів при кожному перегляді поштової скриньки, що могло викликати бoльшую, ніж хотілося б, навантаження на систему Версія мовою Сі – це єдиний процес, що запускає stat для файлу кожну хвилину У що обійдеться програма перевірки поштової скриньки, яка весь час працює у фоновому режимі За оцінками авторів, буде витрачено менше однієї секунди на годину, що досить мало, і це надзвичайно важливо

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*