next up previous contents
Next: Fájlok konkurrens elérése Up: Rendszerhívások Previous: A fájlrendszer és

Egyéb, fájlokkal kapcsolatos rendszerhívások

A stat() és fstat() rendszerhívással fájloknak különféle jellemzoit lehet lekérdezni. Mindkét rendszerhívás elso paramétere azt tartalmazza, hogy melyik fájlról akarunk bovebb információt: az fstat() elso paramétere egy megnyitott fájlra vonatkozó fájldeszkriptor, míg a stat() rendszerhívás elso paramétere egy string, amely egy abszolút vagy relatív fájlnevet tartalmaz. Mindkét rendszerhívás második paramétere egy stat típusú struktúrára mutató pointer. Ebben a strukturában adja vissza az operációs rendszer a fájlról a következo információkat:

struct stat {
  short int st_dev;       /* Melyik periferian van a filet tartalmazo
                             directorybejegyzes */
  unsigned short st_ino;  /* Hanyas a file inode-janak a sorszama*/
  unsigned short st_mode; /* Egyeb dolgok, pl. rwx-bitek */
  short int st_nlink;     /* Hany link kapcsolodik a filehoz */
  short int st_uid;       /* A file tulajdonosanak uid-je */
  short int st_gid;       /* A file tulajdonosanak gid-je */
  short int st_rdev;      /* A blokk/karakter-specialis fileoknal ez
                             tartalmazza a hozza tartozo I/O egyseg
                             belso sorszamat */
  long st_size;           /* A file meretet tartalmazza */
  long st_atime;          /* A file legutolso hasznalatanak a
                             datumat tartalmazza */
  long st_mtime;          /* Az utolso modositas datuma */
  long st_ctime;          /* A file letrehozasanak a datuma */
};

A következo példa bemutatja a stat() használatát:

/*
 * Megallapitja az egyetlen parametereben atadott file tipusat.
 */

#include <sys/types.h>
#include <sys/stat.h>

main(argc,argv)
  int argc;
  char **argv;
{
  struct stat tmpstat; 

  if (argc != 2) {       
    printf("Usage: %s filename\n",argv[0]);
    exit(-1);
  }
  if (stat(argv[1],&tmpstat) < 0) {
    perror("stat");
    exit(-1);
  }
  printf("%s: ",argv[1]); /* Filenevet kiirom */
  switch (tmpstat.st_mode & S_IFMT) {
    case S_IFDIR: printf("directory");
                  break;
    case S_IFCHR: printf("karakter-specialis file");
                  break;
    case S_IFBLK: printf("blokk-specialis file");
                  break;
    case S_IFREG: printf("kozonseges file");
                  break;
    default:      printf(" ?");
                  break;
  }
  printf("\n");
}

A dup() rendszerhívás egyetlen paramétere egy megnyitott fájlra mutató fájldeszkriptor. Visszatérési értéke egy másik fájldeszkriptor lesz, amely ugyanarra a fájlra vonatkozik, mint amit a paraméterében megadtak (bármelyik fájldeszkriptoron is olvasunk, a fájlból egy karaktert csak egyszer fogunk beolvasni, mivel a fájlbeli pozíció a két deszkriptornál mindig meg fog egyezni).

A pipe() rendszerhívás segítségével a már korábban is megemlített pipe-okat tudjuk létrehozni. Ennek a paramétere egy olyan két-elemu tömb, amelynek mindkét eleme egész típusú, és a rendszerhívás végrehajtása után egy-egy fájldeszkriptort tartalmaz. Amit az 1-es indexu tömbelemben levo fájldeszkriptorú fileba írunk, azt a 0-ás indexu tömbelemben levo fájldeszkriptorú fájlból olvashatjuk ki. Ennek a használatára példa a következo programrészlet:

   #include <stdio.h>

   main()
   {
     int pfd[2]; /* A pipe filedeszkriptorjai ebbe a tombbe kerulnek*/
     int szam;

     /*
       .
       .
     */
     pipe(pfd);
     if (fork() == 0) {
          close(pfd[0]);
          close(1);
          dup(pfd[1]);  /* standard output:=pipe file */
          close(pfd[1]);
          printf("%d",23); /* Elkuldjuk a masik folyamatnak */
     } else {
          close(pfd[1]);
          close(0);
          dup(pfd[0]);  /* Uj standard input: masik folyamattol */
          close(pfd[0]);
          scanf("%d",&szam); /* Fogadjuk a masik folyamat outputjat */
     }
     /*
       .
       .
     */
   }

A link() rendszerhívással lehet egy fájlra vonatkozó linket létrehozni, az unlink() rendszerhívással pedig egy link megszüntetheto (vagyis a felhasználó ezt úgy látja, hogy a fájl a directoryjából törlodik). A link-nek két string típusú paramétere van, az elso annak a létezo fájlnak neve, amelyre a létrehozandó link mutasson; a második pedig az újonnan létrehozandó fájl nevét tartalmazza. Ha egy más felhasználó fájljait (egyenként ...) meglinkeljük megunknak, akkor a fájlhoz hozzáférhetünk, de a védelmi bitjeit nem változtathatjuk meg! Az unlink() egyetlen paramétere a törlendo fájl neve.

A mount() rendszerhívással lehet egy fájlrendszert "beilleszteni" valamelyik directory alá. Legyen például egy 286-os AT-n az elso lemezegységnek a UNIX alatti neve: /dev/fd0. Ha a benne levo lemez egy érvényes directory-struktúrát (fájlrendszert) tartalmaz, és azt valamelyik winchesteren levo directory alá be akarjuk rakni, akkor egy ilyesmi rendszerhívást kell kiadni:

     mount("/dev/fd0","/usr/csb/aldir",0);

A mount rendszerhívás által beillesztett fájlrendszert az umount() rendszerhívással lehet a rendszerbol "kiilleszteni". Ennek alkalmazására tekintsük a következo programrészletet:

     umount("/dev/fd0");

(A mount() és az umount() rendszerhívásokat csak a rendszergazda adhatja ki!)

A sync() rendszerhívással lehet a cache-memóriában tárolt "aktualizált" lemezblokkokat a lemezre fizikailag kiiratni (a rendszerhívásnak nincsenek paraméterei).

A chdir() rendszerhívással lehet az aktuális directoryt (munkadirectoryt) beállítani. Egyetlen paramétere az új munkadirectory nevét tartalmazza.

Az mkdir() ill. rmdir() rendszerhívásokkal lehet egy új directoryt létrehozni, ill. egy meglevo directoryt törölni. Mindkét rendszerhívás egyetlen paramétere a létrehozandó (ill. törlendo) directorynak a neve.



next up previous contents
Next: Fájlok konkurrens elérése Up: Rendszerhívások Previous: A fájlrendszer és



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996