Ciele
- Základná práca so súborom
- Spoznať typy súborov a ich možnosti
- Po prejdení scenárom prosím vyplnte dotazník
Postup
Krok 1: Otvorenie súboru
Príprava
Stiahnite si tento archív k cvičeniu.
Obsah archívu.
.
└── 01
├── Makefile // svoje .c súbory možete skompilovať: make tvoje_riesenie
├── open_file_exists.c // .c súbory obsahujú príklad alebo kostru programu k úlohe
├── prepare-v1.sh
├── remove-v1.sh
├── tests //testy k úlohám
│ └── u1-1-test.sh
└── u1-1.c
Pracujte v adresári pomenovanom podľa cvičenia napr. ak pri rozbalení 01.zip
vznikne 01
, pracujte v adresári 01
.
Spustite skript prepare-v1.sh
, ktorý vytvorí potrebné súbory k cvičeniu: ./prepare-v1.sh
.
Poznámka
Ak súbor, s ktorým pracuje úloha nechtiac zmeníte, môžete ho nanovo vytvoriť podľa pokynov v časti //príprava
uvedenej pri úlohe alebo zmazaním celej štruktúry súborov, s ktorými cvičenie pracuje skriptom remove-v1.sh
a následne spustením prepare-v1.sh
Poznámka
Ak je úloha testovaná, test je možné spustiť nasledovne:
príklad: otestovanie riešenia úlohy 1.1, váš program má názov v tvare napr. u1-1
./tests/u1-1-test.sh
Teória - open
Ak má byť obsah súboru zmenený počas behu programu, je potrebé pre získanie prístupu k nemu alebo pre jeho vytvorenie „požiadať“ operačný systém. V oboch prípadoch je prvým krokom otvorenie súboru.
Služba jadra open()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *pathname, int flags, mode_t mode)
Parametere | Popis |
---|---|
pathname | názov alebo cesta k súboru |
flags | flagy - spresnenie
|
mode | pri vytvorení nového súboru, sú ním určené prístupové práva |
Ukočenie | Návratová hodnota |
---|---|
úspešné | deskriptor súboru (file descriptor), prirodzené číslo odkazujúce na záznam v tabuľke otvorených súborov, ktorú spravuje operačný systém. Každým volaním open() je vytvorený nový deskriptor, odkaz na záznam. [man 2 open] |
chyba | - 1 |
Výber možných hodnôt pre parameter flags
, rozšírený zoznam v manuáloch
flags - nastaveie režimu | musí obsahovať jednu z nich |
---|---|
O_RDONLY | otvoriť súbor len pre čítanie |
O_WRONLY | otvoriť súbor len pre zápis |
O_RDWR | otvoriť súbor pre zápis aj čítanie |
Aktivita
Otázka 1.1
Príklad - open
Príklad:
Otvorenie súboru file1.txt
, ktorý sa nachádza v adresári dir1
len na čítanie.
//open_file_exists.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
const char* path_to_file= "dir1/file1.txt";
int fd = open(path_to_file, O_RDONLY);
printf("Deskriptor suboru: %d\n\n", fd);
printf("Vypis premennej errno: %d\n",errno);
perror("Vypis funkcie perror pre funkciu open");
return 0;
}
//výstup
Deskriptor suboru: 3
Vypis premennej errno: 0
Vypis funkcie perror pre funkciu open: Success
Poznámka
Súbor s príkladom open_file_exists.c
máte v archíve.
Preložiť ho môžete pomocou súboru Makefile
.
//preklad
$ make open_file_exists
//spustenie preloženého súboru
$ ./open_file_exists
Upozornenie
Ak ste nechtiac upravili súbory, potrebnú štruktúru môžete vytvoriť nasledujúcim postupom.
//príprava
mkdir dir1
echo presmerovany_vystup_do_suboru > dir1/file1.txt
Aktivita
Úloha 1.1
Pracujte so súborom u1-1.c
, ktorý obsahuje kód z príkladu. Upravte kód tak, aby parameter path
služby open()
bol zadaný z povelového riadka. Pokúste sa otvoriť súbor file2
v režime iba na čítanie. Súbor file2
neexistuje, preto očakávajte chybu. Všimnite si výpis funkcie perror
, ktorý závisí od hodnoty errno.
//preklad
make u1-1
//spustenie programu
./u1-1 file2
//otestovanie riešenia
./tests/u1-1-test.sh
Krok 2: Linky
Aktivita - Pevný a symbolický odkaz
//príklad výstupu: ls -lai
11420219 drwxrwxr-x 2 sofia sofia 4096 apr 15 02:55 .
11409366 drwxrwxr-x 3 sofia sofia 4096 apr 15 02:53 ..
11413898 -rw-rw-r-- 3 sofia sofia 5 apr 15 02:55 file08.txt
11413900 lrwxrwxrwx 1 sofia sofia 10 apr 15 02:55 file08.txt-soft -> file08.txt
11413898 -rw-rw-r-- 3 sofia sofia 5 apr 15 02:55 file08.txt-hard
Vo výstupe je ukázané, že na jeden fyzický súbor (t.j. na rovnaký i-node) môže odkazovať viac adresárových položiek.
Poznámka
Pri úlohách 2.1 - 2.3 pracujte v adresári u5-1-dir
.
Úloha 2.1
V termináli zobrazte obsah súborov file08.txt
, file08.txt-sotf
a file08.txt-hard
. Pomôcť vám môže príkaz more.
Úloha 2.2
Premenujte názov súboru file08.txt
na renamed
. Môžete použiť príkaz mv
napr. mv stary_nazov novy_nazov
.
Otázka:
Pri ktorom odkaze nastane chyba, ak budete opäť vypisovať obsah súborov file08.txt-hard
a file08.txt-soft
?
- a symbolický odkaz
- b pevný odkaz
- c obe
Upozornenie
Ak ste nechtiac upravili súbory, potrebnú štruktúru môžete vytvoriť nasledujúcim postupom.
//príprava
mkdir u5-1-dir
echo "obsah suboru file08.txt" > u5-1-dir/file08.txt
ln u5-1-dir/file08.txt u5-1-dir/file08.txt-hard
cd u5-1-dir
ln -s file08.txt file08.txt-soft
cd ..
Teória - odkazy
Symbolický odkaz (symbolic link, soft link) odkazuje na iný súbor podľa názvu. Je v ňom uložená len informácia, na aký súbor odkazuje. Vo výpise ls -l
je označený inak ako obyčajný súbor.
Úloha 2.3
Zobrazte názov súboru, na ktorý odkazuje symbolický link file08.txt-soft
. Skúste použiť príkaz readlink.
Pevný odkaz (hard link) odkazuje na i-uzol, rovnako ako pôvodný názov.
11413898 4 -rw-rw-r-- 3 sofia sofia 24 apr 17 01:02 file08.txt-hard
11413900 0 lrwxrwxrwx 1 sofia sofia 10 apr 15 02:55 file08.txt-soft -> file08.txt
11413898 4 -rw-rw-r-- 3 sofia sofia 24 apr 17 01:02 renamed
