русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Open, creat, close, unlink


Дата додавання: 2014-11-28; переглядів: 900.


Попри типові стандартний ввід, вивід і помилку, ви повинні явно відкрити файли для того, щоб читати або записувати до них. Існують два системні виклики для цього: open і creat (саме так, а не «create»). open чимось схожий на функцію fopen, розглянуту в Розділі 7, за винятком того, що замість повертати покажчик на файл, вона повертає дескриптор, — просто ціле. openвидасть -1, якщо сталася якась помилка.

#include <fcntl.h>

 

int fd;

int open(char *name, int flags, int perms);

 

fd = open(name, flags, perms);

Так само як і у випадку з fopen, аргумент name — це символьний ланцюжок, що містить назву файла. Другий аргумент, flags, являється цілим (int), що вказує режим відкриття файла; основними значеннями є

O_RDONLY відкрити тільки для читання
O_WRONLY відкрити тільки для запису
O_RDWR відкрити як для читання, так і для запису

Ці константи на System V UNIX визначено в <fcntl.h>, і в <sys/file.h> на версіях Берклі (BSD).

Щоб відкрити файл, який існує, для читання:

fd = open(name, O_RDONLY,0);

Аргумент дозволу (perms) завжди дорівнюватиме нулеві для користувачів open, ми це обговоримо пізніше. Помилкою буде намагатися відкрити файл, якого не існує. Для створення нових файлів або перезапису старих є системний виклик creat.

int creat(char *name, int perms);

 

fd = creat(name, perms);

який вертає дескриптор файла, якщо виклик спромігся створити його, і -1 — якщо ні. Якщо файл вже існує, creat зітне його довжину до нуля, звільняючи його попередній зміст таким чином, тож це не вважається помилкою — створити файл, який вже існує.

Якщо файла до цього не існувало, creat створить його з дозволами, вказаними аргументомperms. У файловій системі UNIX, існує дев'ять бітів інформації про дозволи, пов'язаних з файлами, які керують читанням, записом і можливістю виконання власником файла, групою, до якої він належить, і рештою користувачів. Таким чином, зручно вказати дозволи як трьохзначне вісімкове число. Наприклад, 0775 вказує на дозвіл на читання, запис і виконання власником, читання і виконання для групи і решти користувачів.

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

#include <stdio.h>

#include <fcntl.h>

#include "syscalls.h"

#define PERMS 0666 /* читання й запис для власника, *

* групи й решти */

 

void error(char *, ...);

 

/* cp: копіює f1 до f2 */

main(int argc, char *argv[])

{

int f1, f2, n;

char buf[BUFSIZ];

 

if (argc != 3)

error("Usage: cp from to");

if ((f1 = open(argv[1], O_RDONLY, 0)) == -1)

error("cp: can't open %s", argv[1]);

if ((f2 = creat(argv[2], PERMS)) == -1)

error("cp: can't create %s, mode %03o",

argv[2], PERMS);

while ((n = read(f1, buf, BUFSIZ)) > 0)

if (write(f2, buf, n) != n)

error("cp: write error on file %s", argv[2]);

return 0;

}

Ця програма створює файл зі сталими правами доступу 0666. Завдяки системному викликовіstat, розглянутому в Розділі 8.6, ми можемо визначити дозволи файла, який існує, і таким чином забезпечити тими самими копіями.

Зверніть увагу, що функцію error викликано зі змінним списком аргументів, дуже схоже наprintf. Втілення error ілюструє, як використати ще одного члена сімейства printf. Функція стандартної бібліотеки vprintf схожа на printf, за винятком того, що змінний список аргументів замінено на єдиний аргумент, який ініціюється викликом макросу va_start. Подібним чином, vfprintf і vsprintf відповідають fprintf із sprintf.

#include <stdio.h>

#include <stdarg.h>

 

/* error: виводить повідомлення про помилку і *

* завершує роботу */

void error(char *fmt, ...)

{

va_list args;

 

va_start(args, fmt);

fprintf(stderr, "error: ");

vprintf(stderr, fmt, args);

fprintf(stderr, "\n");

va_end(args);

exit(1);

}

Існує обмеження (часто, коло 20-и) кількості файлів, які програма може одночасно відкрити. Відповідно, будь-яка програма, яка має намір обробити багато файлів, повинна бути готовою до багаторазового використання того самого дескриптора. Функція close(int fd) розриває зв'язок між дескриптором і відкритим файлом, і звільняє дескриптор для використання іншим файлом; вона відповідає fclose зі стандартної бібліотеки, за винятком браку буфера для очищення. Завершення програми через exit або return у main закриє всі відкриті файли.

Функція unlink(char *name) видаляє назву файла з файлової системи. Вона відповідає функції стандартної бібліотеки remove.

Вправа 8-1. Перепишіть програму cat з Розділу 7, використовуючи read, write, open іclose замість їхніх еквівалентів зі стандартної бібліотеки. Поекперементуйте щодо перевірки відносної швидкості двох версій програми.


<== попередня лекція | наступна лекція ==>
Низькорівневий ввід/вивід - read і write | Довільний доступ - lseek


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн