22. týždeň

Testovací scenár 1

Ciele

  1. Základná práca so súborom
  2. Spoznať typy súborov a ich možnosti
  3. 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
  • ako bude súbor otvorený
  • aké podmienky vzhľadom na existenciu súboru musia byť splnené
Parameter môže nadobúdať jednu alebo kombináciu hodnôt.
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

V akom poradí budú doplnené parametre? (Odpoveď uveďte v tvare: "aaa" bez úvodzoviek a medzier.)

  • a. O_RDWR | O_CREAT
  • b. S_IRUSR | S_IWUSR | 00070
  • c. "input.txt"
int fd = open([_______________], [_______________], [_______________]);
Správna odpoveď: cab
Nesprávna odpoveď

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
zdroj
Obr. 1: zdroj

Zdroje

  1. Sofia - Súbory
  2. Sofia - Adresáre
  3. DOTAZNÍK