- •28. Синхронізація за принципом бар'єра
- •29. Синхронізація процесів користувача у Linux.Ф’ютекси
- •30. Види міжпроцесової взаємодії
- •31. Міжпроцесова взаємодія на базі спільної пам'яті
- •32. Технології передавання повідомлень
- •33. Взаємні блокування
- •34. Умови виникнення взаємних блокувань
- •35. Запобігання взаємним блокуванням на рівні ос
- •36. Підхід ведучого-веденого
- •37. Підхід портфеля задач
- •38. Підхід конвеєра
- •39. Проблеми реалізації'віртуальної пам'яті. Фрагментація пам'яті
- •41. Сегментація пам'яті
- •42. Сторінкова організація пам'яті
- •43. Сторінково-сегментна організація пам'яті
- •44. Поняття підкачування
- •45. Поняття сторінкового переривання
- •46. Алгоритм fifo
- •47. Оптимальний алгоритм
- •48. Алгоритм lru
- •49. Годинниковий алгоритм
- •50. Організація заміщення сторінок
- •51. Поняття файла і файлової системи
- •52. Організація інформації у файловій системі
- •53. Операції над файлами і каталогами
- •54. Файлові операції posix
54. Файлові операції posix
Відкриття і створення файлів
Для відкриття файла використовують системний виклик ореп(), першим параметром якого є шлях до файла.
#і ndude <fcntl,h>
int open(const char ‘pathname. int flags[. mode_t mode]);
Виклик open() повертає цілочислове значення - файловий дескриптор.
Закриття файла
Файл закривають за допомогою системного виклику close(), що приймає файловий дескриптор:
closetfdl);
Читання і записування даних
Для читання даних із відкритого файла використовують системний виклик readO: ssizet re ad (i n t fdl, void *buf, size_t count);
). Виклик readO повертає реальний обсяг прочитаних даних (тип ssizet є цілочисловим). Покажчик позиції у файлі пересувають за зчитані дані.
char buf [ 1 00] ;
jj читають 100 байт з файлу в buf
int bytes_read = read(fdl. buf. sizeof (buf));
Для записування даних у відкритий файл через файловий дескриптор використовують системний виклик writeC):
ssize_t writetint fdl, const void *buf. size_t count);
Внаслідок цього виклику буде записано count байтів у файл через дескриптор fdl із пам'яті, на яку вказує buf. Виклик wri te() повертає обсяг записаних даних.
int fdl. bytes_written;
fdl - openC./myfile.txt", 0_RDWR10_CREAT. 00644); bytes_written = writeCfdl, "hello", sizeofC'hello");
Реалізація копіювання файлів
char buf[ 1024] ; int bytes_read. intfile, outfile; jj відкриття вихідного файла для читання infile = openCinfile.txt". 0_RD0NLY); if Cinfile == -1 ) {
printf ("помилка під час відкриття файла\п"); exit(-l);
}
jj створення результуючого файла, перевірку помилок пропущено outfile - openC'ou tfile.txt", O_WR0NLY|O_CREAT|O_TRUNC. 0644); do {
jj читання даних із вихідного файла у буфер bytes_read - readtinfile. buf. s ize of ( b uf ) ) ;
// записування даних із буфера в результуючий файл if (bytes_read > 0) writeioutfile. buf, bytes_read):
} while (bytes_read > 0);
Переміщення покажчика поточної позиції у файлі
Кожному відкритому файлу відповідає покажчик позиції (зсув) усередині файла. Його можна пересувати за допомогою системного виклику 1 seek О:
off_t lseekiint fdl. off_t offset, int whence);
П
ssize t
араметр offset задає величину переміщення покажчика. Режим переміщення задають параметром whence, який може набувати значень SEEKSET (абсолютнепереміщення від початку файла), SEEK_CUR (відносне переміщення від поточного місця покажчика позиції) і SEEK_END (переміщення від кінця файла).
// переміщення покажчика позиції на 100 байт від поточного місця Iseek (outfile. 100. SEEK_CUR);
// записування у файл
write (outfile. "hello". sizeofC'hello")):
Збирання інформації про атрибути файла
Для отримання інформації про атрибути файла (тобто про вміст його індексного дескриптора) використовують системний виклик stat().
#include <sys/stat.h>
int stattconst char ‘path. struct stat *attrs);
Першим параметром є шлях до файла, другим — структура, у яку записуватимуться атрибути внаслідок виклику.
