Κλήσεις του λειτουργικού συστήματος Unix σε C
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Παράμετροι της διεργασίας
Οι διεργασίες λαμβάνουν τις παραμέτρους τις οποίες έδωσε ο χρήστης
στον φλοιό στον πίνακα argv και τον αριθμό των παραμέτρων στη
μεταβλητή argc.
Αυτές ορίζονται στην C ως ορίσματα της διαδικασίας main με τον
παρακάτω τρόπο:
main(int argc, char *argv[])
{
...
}
Το πρώτο στοιχείο του πίνακα argv, το argv[0], περιέχει πάντα το
όνομα της διεργασίας.
Τα επόμενα στοιχεία περιέχουν τις αντίστοιχες παραμέτρους.
Για παράδειγμα αν ο χρήστης εκτελέσει την εντολή rm foo
οι μεταβλητές argc, argv θα έχουν τις παρακάτω τιμές:
argc: 2
argv[0]: "rm"
argv[1]: "foo"
Άσκηση
Με βάση τα παραπάνω γράψτε το πρόγραμμα myecho το οποίο εκτυπώνει τις
παραμέτρους που του δώσατε.
Παράδειγμα
kerkis:~$ myecho hello world
hello world
kerkis:~$
Η κλήση mkdir
Η κλήση του λειτουργικού συστήματος mkdir δημιουργεί έναν
νέο κατάλογο.
Έχει ως όρισμα το όνομα του νέου καταλόγου και τις άδειες πρόσβασης με τις
οποίες πρέπει να δημιουργηθεί.
Άσκηση
Με βάση τα παραπάνω γράψτε το πρόγραμμα mymkdir το οποίο δημιουργεί
έναν νέο υποκατάλογο.
Ως άδεια στη συνάρτηση mkdir δώστε τον αριθμό 0777.
Παράδειγμα
kerkis:~$ mymkdir foo
kerkis:~$ ls -l
...
drwxr-xr-x 2 dspin users 1024 Oct 21 12:05 foo/
...
kerkis:~$
Οι κλήσεις πρόσβασης σε αρχεία
-
Η κλήση του λειτουργικού συστήματος open(filename, mode) επιτρέπει
την πρόσβαση στο αρχείο με όνομα filename και επιστρέφει
έναν ακέραιο περιγραφέα του αρχείου ο οποίος χρησιμοποιείται
στις επόμενες κλήσεις πρόσβασης σε αυτό (read/write/close).
Το όρισμα mode πρέπει να είναι 0 για να προσδιορίσουμε ανάγνωση από το αρχείο.
-
Η κλήση του λειτουργικού συστήματος read(fd, buff, size) επιτρέπει
την ανάγνωση count το πολύ χαρακτήρων από το αρχείο που προσδιορίζεται
με τον ακέραιο περιγραφέα fd στον ενταμιευτή buff.
Η συνάρτηση read επιστρέφει τον αριθμό των χαρακτήρων που διαβάστηκαν.
-
Ο ενταμιευτής buff ορίζεται συνήθως ως ένας πίνακας χαρακτήρων:
char buff[1024];
-
Η κλήση του λειτουργικού συστήματος write(fd, buff, count) επιτρέπει
την εγγραφή count χαρακτήρων από τον ενταμιευτή buff
στο αρχείο που προσδιορίζεται με τον ακέραιο περιγραφέα fd.
-
Ο ακέραιος περιγραφέας 0 ορίζει την κανονική είσοδο της διεργασίας
και ο ακέραιος περιγραφέας 1 την κανονική έξοδο.
Για παράδειγμα η κλήση write(1, "hello", 4) θα τυπώσει hello στην
κανονική έξοδο της διεργασίας (την οθόνη αν δεν έχει αλλάξει).
-
Η κλήση του λειτουργικού συστήματος close(fd) δηλώνει
ότι δε θα υπάρξει άλλη επικοινωνία read/write
με το αρχείο που προσδιορίζεται από τον ακέραιο περιγραφέα fd.
Άσκηση
Με βάση τα παραπάνω γράψτε το πρόγραμμα mycat το οποίο εκτυπώνει το
περιεχόμενο των αρχείων που του δίδονται ως παράμετροι.
Για ευκολία στην αρχή υλοποιήστε το mycat για ένα μόνο αρχείο με μέγεθος
μικρότερο από 1024 byte.
Παράδειγμα
kerkis:~$ mycat /etc/motd
Linux 2.0.30.
kerkis:~$
Βιβλιογραφία
- Brian W. Kernighan and Rob
Pike.
The UNIX Programming Environment.
Prentice-Hall, 1984.
- W. Richard Stevens.
Advanced Programming in the UNIX Environment.
Addison-Wesley, 1992.