0
FILES- 2 Γ.Μανάρας
<ul><li>Αρχεία και κλήσεις συστήματος </li></ul><ul><li>Χειρισμός λαθών </li></ul><ul><li>Ιδιότητες αρχείων </li></ul><ul>...
<ul><li>Το  Unix  παρέχει 6 βασικές κλήσεις συστήματος για λειτουργίες  I/O </li></ul><ul><li>int open(char  *name, int  m...
<ul><li>mode :  τρόπος ανοίγματος </li></ul><ul><li>O_RDONLY </li></ul><ul><li>O_WRONLY </li></ul><ul><li>O_RDWR  </li></u...
<ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int fd   = open(&quot;myfile&quot;   , O_WRONLY | O_CREAT | O_TRUNC  ...
<ul><li>int dup(int fd);  Αυτό το  system call  δημιουργεί ένα αντίγραφο του  fd ,  έτσι ώστε από το σημείο που καλείται κ...
<ul><li>Αν κατά την κλήση ενός  system call  συμβεί ένα λάθος, ενημερώνεται η  global  μεταβλητή  errno  με τον κωδικό λάθ...
<ul><li>int stat(const char *path, struct stat *buf);  Πληροφορίες για ένα αρχείο. Αν το αρχείο είναι σύνδεσμος οι πληροφο...
<ul><li>int getsize(char *filename) </li></ul><ul><li>{ </li></ul><ul><li>struct stat attrib; </li></ul><ul><li>stat(filen...
<ul><li>Macros  που δίνουν τον τύπο αρχείου στο  stat.h </li></ul><ul><li>#define  S_ISBLK(m)   /* is block device */ </li...
<ul><li>main(int argc, char *argv[]) </li></ul><ul><li>{ </li></ul><ul><li>struct stat attrib; </li></ul><ul><li>if (argc ...
<ul><li>Το διάβασμα καταλόγων γίνεται με τις παρακάτω κλήσεις συστήματος- sys/dir.h </li></ul><ul><li>DIR * opendir(const ...
<ul><li>main(int argc,char *argv[]) </li></ul><ul><li>{ struct dirent *dptr; </li></ul><ul><li>DIR *dirp; </li></ul><ul><l...
<ul><li>if((dirp=opendir(directory))==NULL) </li></ul><ul><li>{ </li></ul><ul><li>fprintf(stderr, &quot;Error opening %sn&...
<ul><li>int chmod(const char *path, mode_t mode);  //  χρησιμοποιεί το  path </li></ul><ul><li>int fchmod(int fd, mode_t m...
Upcoming SlideShare
Loading in...5
×

ΛΣ1FILES2v0

466

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
466
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "ΛΣ1FILES2v0"

  1. 1. FILES- 2 Γ.Μανάρας
  2. 2. <ul><li>Αρχεία και κλήσεις συστήματος </li></ul><ul><li>Χειρισμός λαθών </li></ul><ul><li>Ιδιότητες αρχείων </li></ul><ul><li>Κατάλογοι </li></ul><ul><li>Αλλαγή δικαιωμάτων πρόσβασης </li></ul>
  3. 3. <ul><li>Το Unix παρέχει 6 βασικές κλήσεις συστήματος για λειτουργίες I/O </li></ul><ul><li>int open(char *name, int mode [ , int permissions ] ); </li></ul><ul><li>int creat(char *name, int permissions); </li></ul><ul><li>int close(int fd); </li></ul><ul><li>int read(int fd, char *buf, int size); </li></ul><ul><li>int write(int fd, char *buf, int size); </li></ul><ul><li>off_t lseek(int fd, off_t offset, int whence); </li></ul>
  4. 4. <ul><li>mode : τρόπος ανοίγματος </li></ul><ul><li>O_RDONLY </li></ul><ul><li>O_WRONLY </li></ul><ul><li>O_RDWR </li></ul><ul><li>O_APPEND </li></ul><ul><li>O_CREAT </li></ul><ul><li>O_TRUNC </li></ul>
  5. 5. <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int fd = open(&quot;myfile&quot; , O_WRONLY | O_CREAT | O_TRUNC , 0644); </li></ul><ul><li>// ίδιο με : fopen(“myfile”, “w”); </li></ul><ul><li>if (fd == -1) { </li></ul><ul><li>perror(&quot; fd == -1 !!! &quot;); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  6. 6. <ul><li>int dup(int fd); Αυτό το system call δημιουργεί ένα αντίγραφο του fd , έτσι ώστε από το σημείο που καλείται και μετά μπορούμε για το ίδιο αρχείο να χρησιμοποιούμε είτε τον ένα file descriptor είτε τον άλλο </li></ul><ul><li>int dup2(int fd1, int fd2) Το system call dup2 ελευθερώνει τον fd2 - αν είναι δεσμευμένος - και τον αντιστοιχεί στο ίδιο αρχείο με file descriptor fd1 </li></ul>
  7. 7. <ul><li>Αν κατά την κλήση ενός system call συμβεί ένα λάθος, ενημερώνεται η global μεταβλητή errno με τον κωδικό λάθους. Στη συνέχεια η κλήση της perror( ) εμφανίζει την περιγραφή του λάθους, το δε αλφαριθμητικό όρισμα που της περνάμε, εμφανίζεται πριν την περιγραφή του λάθους που δίνει το σύστημα </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int fd = open(&quot;notexistfile&quot;, 0); </li></ul><ul><li>if (fd == -1) </li></ul><ul><li>{ </li></ul><ul><li>printf(&quot;errno = %dn&quot;, errno); </li></ul><ul><li>perror(&quot;open&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  8. 8. <ul><li>int stat(const char *path, struct stat *buf); Πληροφορίες για ένα αρχείο. Αν το αρχείο είναι σύνδεσμος οι πληροφορίες θα αφορούν το αρχείο στο οποίο δείχνει ο σύνδεσμος </li></ul><ul><li>int fstat(int fd, struct stat *buf); Το ίδιο με την stat( ) </li></ul><ul><li>int lstat(const char *path, struct stat *buf); Παρόμοια με την stat( ), με τη διαφορά ότι δεν ακολουθεί τον σύνδεσμο </li></ul><ul><li>Σε περίπτωση επιτυχίας επιστρέφουν 0, σε λάθος -1 με ταυτόχρονη ενημέρωση της errno </li></ul><ul><li>struct stat </li></ul><ul><li>{ </li></ul><ul><li>mode_t st_mode; /* File mode (type, perms) */ </li></ul><ul><li>ino_t st_ino; /* Inode number */ </li></ul><ul><li>nlink_t st_nlink; /* Number of links */ </li></ul><ul><li>uid_t st_uid; /* User ID of the file's owner */ </li></ul><ul><li>gid_t st_gid; /* Group ID of the file's group */ </li></ul><ul><li>off_t st_size; /* File size in bytes */ </li></ul><ul><li>time_t st_atime; /* Time of last access */ </li></ul><ul><li>// ………………….. </li></ul><ul><li>} </li></ul>
  9. 9. <ul><li>int getsize(char *filename) </li></ul><ul><li>{ </li></ul><ul><li>struct stat attrib; </li></ul><ul><li>stat(filename, &attrib); </li></ul><ul><li>return attrib.st_size; </li></ul><ul><li>} </li></ul><ul><li>main(int argc, char *argv[]) </li></ul><ul><li>{ int i; </li></ul><ul><li>for(i=1; i<argc; i++) </li></ul><ul><li>{ </li></ul><ul><li>printf(&quot;%dn&quot;, getsize(argv[i])); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  10. 10. <ul><li>Macros που δίνουν τον τύπο αρχείου στο stat.h </li></ul><ul><li>#define S_ISBLK(m) /* is block device */ </li></ul><ul><li>#define S_ISCHR(m) /* is character device */ </li></ul><ul><li>#define S_ISDIR(m) /* is directory */ </li></ul><ul><li>#define S_ISFIFO(m) /* is fifo pipe */ </li></ul><ul><li>#define S_ISREG(m) /* is regular file */ </li></ul>
  11. 11. <ul><li>main(int argc, char *argv[]) </li></ul><ul><li>{ </li></ul><ul><li>struct stat attrib; </li></ul><ul><li>if (argc != 2){ fprintf(stderr,&quot;Usage: %s filen&quot;, argv[0]); exit(1); } </li></ul><ul><li>if (stat(argv[1], &attrib) == -1){ perror(&quot;stat&quot;); exit(2); } </li></ul><ul><li>if (S_ISBLK(attrib.st_mode)) </li></ul><ul><li>printf(&quot;%s is a block special filen&quot;, argv[1]); </li></ul><ul><li>else if (S_ISCHR(attrib.st_mode)) </li></ul><ul><li>printf(&quot;%s is a character special filen&quot;, argv[1]); </li></ul><ul><li>else if (S_ISREG(attrib.st_mode)) </li></ul><ul><li>printf(&quot;%s is a regular filen&quot;, argv[1]); </li></ul><ul><li>else if (S_ISDIR(attrib.st_mode)) </li></ul><ul><li>printf(&quot;%s is a directoryn&quot;, argv[1]); </li></ul><ul><li>else if (S_ISFIFO(attrib.st_mode)) </li></ul><ul><li>printf(&quot;%s is a FIFO or PIPEn&quot;, argv[1]); </li></ul><ul><li>} </li></ul>
  12. 12. <ul><li>Το διάβασμα καταλόγων γίνεται με τις παρακάτω κλήσεις συστήματος- sys/dir.h </li></ul><ul><li>DIR * opendir(const char *path); // Δουλεύει όπως το FILE* fopen() , </li></ul><ul><li>// το DIR αυτό καθ’ εαυτό δεν χρησιμοποιείται, αλλά το περνάμε στις </li></ul><ul><li>// συναρτήσεις που κάνουν τη δουλειά </li></ul><ul><li>struct dirent readdir(DIR *dirp); </li></ul><ul><li>int closedir(DIR *dirp); </li></ul><ul><li>struct dirent{ </li></ul><ul><li>ino_t d_ino; /* i-number */ </li></ul><ul><li>off_t d_off; /* offset into directory file */ </li></ul><ul><li>ushort d_reclen; /* length of record */ </li></ul><ul><li>char d_name[256]; /* file name */ </li></ul><ul><li>} </li></ul>
  13. 13. <ul><li>main(int argc,char *argv[]) </li></ul><ul><li>{ struct dirent *dptr; </li></ul><ul><li>DIR *dirp; </li></ul><ul><li>char directory[256]; </li></ul><ul><li>if (argc==1) </li></ul><ul><li>{ </li></ul><ul><li>strcpy(directory,&quot;.&quot;); </li></ul><ul><li>} </li></ul><ul><li>else if (argc>2) </li></ul><ul><li>{ </li></ul><ul><li>fprintf(stderr,&quot;Usage: %s directoryn&quot;, argv[0]); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>else </li></ul><ul><li>{ </li></ul><ul><li>strcpy(directory, argv[1]); </li></ul><ul><li>} </li></ul>
  14. 14. <ul><li>if((dirp=opendir(directory))==NULL) </li></ul><ul><li>{ </li></ul><ul><li>fprintf(stderr, &quot;Error opening %sn&quot;, directory); </li></ul><ul><li>exit(2); </li></ul><ul><li>} </li></ul><ul><li>while(dptr=readdir(dirp)) </li></ul><ul><li>{ </li></ul><ul><li>printf(&quot;%d %sn&quot;, dptr->d_ino, dptr->d_name); </li></ul><ul><li>} </li></ul><ul><li>closedir(dirp); </li></ul><ul><li>} </li></ul>
  15. 15. <ul><li>int chmod(const char *path, mode_t mode); // χρησιμοποιεί το path </li></ul><ul><li>int fchmod(int fd, mode_t mode); // χρησιμοποιεί τον file descriptor </li></ul><ul><li>S_IRWXU 00700 Read, write, execute by owner </li></ul><ul><li>S_IRUSR 00400 Read by owner </li></ul><ul><li>S_IWUSR 00200 Write by owner </li></ul><ul><li>S_IXUSR 00100 Execute (search if a directory) by owner </li></ul><ul><li>S_IRWXG 00070 Read, write, execute by group </li></ul><ul><li>S_IRGRP 00040 Read by group </li></ul><ul><li>S_IWGRP 00020 Write by group </li></ul><ul><li>S_IXGRP 00010 Execute by group </li></ul><ul><li>S_IRWXO 00007 Read, write, execute (search) by others </li></ul><ul><li>S_IROTH 00004 Read by others </li></ul><ul><li>S_IWOTH 00002 Write by others </li></ul><ul><li>S_IXOTH 00001 Execute by others </li></ul><ul><li>main(){ </li></ul><ul><li>chmod(&quot;testfile&quot;, S_IRWXU | S_IRGRP | S_IXOTH); </li></ul><ul><li>} </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×