Створення файлу – open, creat, close, unlink

Крім використання стандартних файлів введення, виведення і виведення помилок, вам буде потрібно явно відкривати файли для читання і запису Для цієї мети існують два системних виклику: open і creat1

Функція open аналогічна fopen з попередньої глави за винятком того, що вона повертається не покажчик файлу, а файловий дескриптор, має тип int

char  *name

int fd, rwmode

fd  = open(name,  rwmode)

Як і в fopen, параметр name – це рядок, що містить імя файлу А ось параметр типу доступу відрізняється: rwmode має значення 0 для читання, 1 для запису і 2 для читання і запису Функція open повертає -1 У разі помилки, а при успішному завершенні – дескриптор файлу

Спроба відкриття існуючого файлу призводить до помилки Для створення нових файлів і для перезапису вже існуючих призначений системний виклик creat

int  perms

fd  = creat(name,  perms)

Функція creat повертає дескриптор файлу, якщо їй вдалося його створити, і -1 в іншому випадку Якщо файл не існує, то creat ство-

1 Кена Томпсона (Ken Thompson) якось запитали, що б він змінив в UNIX, якби довелося перепроектувати систему заново Він відповів: «Я б написав creat з буквою e»

ет його з правами доступу, Зазначеними в параметрі perms Якщо ж файл вже існує, то creat обріже його до нульової довжини виклик creat для вже існуючого файлу не є помилкою (Права доступу не зміняться) Незалежно від значення perms створений файл відкритий для запису

Як розповідалося в главі 2, інформація про права доступу до файлу зберігається в девяти бітах, що визначають дозвіл на читання, запис і виконання, тому їх прийнято представляти тризначним восьмеричним числом Наприклад, 0755 визначає дозвіл на читання, запис і виконання для власника і на читання і виконання для групи і для інших Не забувайте починати восьмеричні числа з 0, як це прийнято в мові Сі

Для ілюстрації наведемо спрощену версію команди cp Головне спрощення полягає в тому, що наша версія копіює тільки один файл і не дозволяє в якості другого аргументу вказувати каталог Другий вада полягає в тому, що дана версія не зберігає права доступу вихідного файлу (далі буде показано, як з цим впоратися)

/ * Cp: мінімальна версія * /

#include &ltstdioh&gt

# Define PERMS 0644 / * RW для власника, R для групи і решти * / char * progname

main (argc, argv) / * cp: копіювати f1 в f2 * / int argc

char  *argv[]

{

int f1,  f2, n char  buf[BUFSIZ]

progname  =  argv[0] if  (argc  =  3)

error(&quotUsage:  %s  from  to&quot,  progname) if  ((f1  =  open(argv[1],  0))  ==  –1)

error(&quotcant open %s&quot, argv[1])

if ((f2 =  creat(argv[2],  PERMS))  ==  –1) error(&quotcant  create  %s&quot,  argv[2])

while  ((n =  read(f1,  buf,  BUFSIZ))  &gt  0) if  (write(f2,  buf,  n)  =  n)

error(&quotwrite  error&quot,  (char  *)  0) exit(0)

}

Функція error буде описана в наступному розділі

Існує обмеження (значення NOFILE в sys / paramh, зазвичай близько

20) кількості файлів, одночасно відкриваються програмою Отже, якщо програма збирається працювати з багатьма файлами, їй слід подбати про повторне використання файлових де-

скрипторіях Системний виклик close розриває звязок між імям файлу і його дескриптором, звільняючи таким чином дескриптор для використання з іншим файлом Завершення програми за допомогою виклику exit або виходу з main викликає закриття всіх файлів

Системний виклик unlink видаляє імя файл видаляється, якщо це останнє посилання

Джерело: Керниган Б, Пайк Р, 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>

*

*