Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метвказівки для Астистовой1.doc
Скачиваний:
2
Добавлен:
08.11.2019
Размер:
288.26 Кб
Скачать

Приклад виконання завдання.

Розглянемо простий приклад копіювання даних з одного файлу в новий файл.

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <unistd.h>

int main()

{

int fdIn; //Вхідний файл

int fdOut; //Вихідний файл

char buf[256]; //Буфер обміну

char InName[20], OutName[20]; //Імена файлів

ssize _ t nRd;

// Введення імен вхідного і вихідного файлів

printf("Ім'я вхідного файлу -> ");

gets(InName);

printf("Ім'я вихідного файлу -> ");

gets(OutName);

// Відкриття файлів

if((fdIn=open(InName, O _ RDONLY))==- 1)\u007B

perror("Помилка відкриття вхідного файлу");

_ exit(- 1);

}

if((fdOut=open(OutName, O _ WRONLY|O _ CREAT, 644))==- 1)\u007B

perror("Помилка відкриття вихідного файлу");

close(fdIn);

_ exit(- 2);

}

// Цикл копіювання

while((nRd=read(fdIn, buf, 256))>0)\u007B

if(write(fdOut, buf, nRd)<nRd)\u007B

perror("Помилка запису");

close(fdIn);

close(fdOut);

_ exit(- 3);

}

}

close(fdIn);

close(fdOut);

printf("Завершення програми\n");

_ exit(0);

}

При відкритті вхідного файлу задається ключ режиму роботи з файлом "тільки для читання"(O _ RDONLY). Функція повертає дескриптор відкритого файлу. У разі помилки повертається - 1. Для висновку повідомлення про помилку використовується функція perror(). Ця функція виводить текст, що задається їй в якості аргументу. Крім того, функція обробляє системний номер помилки (errno) і додає в рядок, що виводиться, системне повідомлення про помилку.

Функція, що відкриває вихідний файл, повертає дескриптор вихідного файлу. Ця функція виконується з режимами "тільки для запису" (O _ WRONLY) і з ключем створення нового файлу (O _ CREAT). Окрім цього, при виклику функції використовується третій параметр (644), що визначає права доступу до створюваного файлу (читання і запис для власника і тільки читання для інших користувачів).

Створення і знищення жорстких посилань на файли організовуються при використанні функцій link() і unlink(). Зміни режимів доступу до файлів виконуються функціями chmod() і fchmod().

У наведеному прикладі створюється жорстке посилання файлу stat_ex.c на файл з новим ім'ям link_ex.c. При створення посилання функцією link("stat_ex.c", "link_ex.c") в структурі statf фіксується стан початкового файлу, потім число жорстких посилань із структури виводиться на екран. Після цього жорстке посилання знищується (функцією unlink("link _ ex.c")) і знову виводиться лічильник жорстких посилань.

/* Приклад використання функцій link() і stat() */

#include <unistd.h>

#include <sys/stat.h>

main()

{

struct stat statf;

if(link("stat_ex.c","link_ex.c") == -1) {

perror(Помилка link");

return 1;

}

if(stat("stat_ex.c",&statf)) {

perror("Помилка stat");

return 1;

}

printf("Кількість посилань = %d\n",statf.st_nlink);

if(unlink("link_ex.c")) {

perror("Помилка unlink");

return 1;

}

if(stat("stat_ex.c",&statf)) {

perror("Помилка stat");

return 1;

}

printf("Кількість посилань = %d\n",statf.st_nlink);

puts("Кінець програми");

}

Наступний приклад ілюструє можливість зміни режиму доступу до файлу. На початку програми при виклику функції access ("acc _ ex.c", F _ OK |!X _ OK) для файлу acc _ ex.cc виконується перевірка, чи існує файл (прапор F _ OK) і чи заборонений доступ на виконання (прапор !X _ OK) для процесу, що викликає функцію. Якщо файл існує, а доступ на виконання заборонений, то функція повертає значення нуль (виконання заданих прапорами умов). В цьому випадку для установки нових значень прав доступу викликається функція chmod("acc _ ex.c", S _ IRUSR|S _ IWUSR|S _ IXUSR|S _ IROTH|S _ IRGRP). Перший параметр визначає ім'я файлу, значення другого параметра формується логічним складанням прапорів, які визначають дозвіл на читання, запис і виконання для користувача і членів групи, до якої належить користувач. Якщо функція повертає ознаку помилки (результат, відмінний від нуля), то на термінал виводиться повідомлення про помилку і програма повертає код 1.

/* Приклад перевірки файлу і зміни режиму */

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

main()

{

if( ! access("acc_ex.c", F_OK | !X_OK)) {

puts("Установка прав");

if(chmod("acc_ex.c",S_IRUSR | S_IWUSR | S_IXUSR |

S_IROTH | S_IRGRP)) {

perror("Помилка зміни режиму");

return 1;

}

}

}