Skip to content

Instantly share code, notes, and snippets.

@markogresak
Last active August 29, 2015 14:10
Show Gist options
  • Select an option

  • Save markogresak/792253aa9b5a434cd19f to your computer and use it in GitHub Desktop.

Select an option

Save markogresak/792253aa9b5a434cd19f to your computer and use it in GitHub Desktop.

Deskriptorji

Shranimo jih lahko kot int

  • STDIN_FILENO: stdin
  • STDOUT_FILENO: stdout

Ali po imenu datoteke:

int deskriptor = open("pot/ime", {dovoljenje}) // vrne deskriptor

Dovoljenja:

  • O_RDONLY: samo branje
  • O_WRONLY: samo pisanje

Možno je tudi kombiniranje dovoljenj, vendar ni potrebno za to nalogo.

Primer uporabe open:

int vhodnaDatoteka = open("a.txt", O_RDONLY);

Zakljepanje datoteke

flock(deskriptor, {tip zaklepanja})

Tipi zaklepanja:

  • LOCK_SH: deljena ključavnica (SH = shared)
  • LOCK_EX: ekskluzivna ključavnica (EX = exclusive)
  • LOCK_UN: odkleni (UN = unlock)

Branje datoteke

Branje v buffer (char array):

read(deskriptor, {pointer na buffer}, {dolzina bufferja})

Read vrne število prebranih znakov. Zanko za branje ustavimo, ko vrne 0.

Zapisovanje podatkov

zapisovanje n znakov iz bufferja:

write(deskriptor, {pointer na buffer}, {stevilo znakov za zapis})

Hint: zapiši število znakov, ki jih je vrnil read.

Zapiranje datoteke

Zapiranje deskriptorja:

close(deskriptor)

Zapremo lahko tudi stdin ali stdout.

Napake

Do napake je prišlo, če:

  • open vrne -1
  • flock vrne -1
  • število zapisanih znakov ni enako podanemu številu znakov za zapis

Izpisovanje napake:

perror("Napaka")

perror za podan niz doda ": sporočena napaka", tako bo zgornji primer v primeru, da datoteka ne obstaja, izpisal:

 Napaka: No such file or directory

Koda napake je shranjena v spremenljivki errno.

Postopek programa

  • odpri vhodno in izhodno datoteko
  • preveri če je pri odpiranju prišlo do napake
  • (zakleni datoteki)
  • beri iz vhodne, zapisuj v izhodno, vsakič preveri za napako
  • (odkleni datoteki)
  • zapri datoteki

Pri zaklepanju pa moramo najprej odpreti datoteko, saj moramo dobiti deskriptor datoteke.

Vrstni red odklepanja in zapiranja ni pomemben.

Potrebne knjiznice za uporabo naštetih funkcij:

#include <sys/file.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment