Σελίδα 1 από 1

Δομή unix-οειδών

ΔημοσίευσηΔημοσιεύτηκε: 14 Φεβ 2013, 16:59
από lucinos
Ένα από τα πιο ενδιαφέροντα στοιχεία τού unix και τών unix-οειδών είναι η μαθηματική απλότητα τής δομής του. Υπάρχει μια ρήση που λέει: «όποιος δεν καταλαβαίνει το unix είναι καταδικασμένος να το επανεφεύρει... ανεπαρκώς».

Κατ αρχήν τον έλεγχο τού υλικού τον αναλαμβάνει ένα πρόγραμμα, ο πυρήνας (ο Linux στην ειδική περίπτωση μιας διανομής λίνουξ). Πέρα από τον πυρήνα φαίνεται να υπάρχουν μονάχα τρεις κατηγορίες οντοτήτων.

Η πρώτη κατηγορία είναι τα αρχεία. Γενικότερα το αρχείο νομίζω μπορεί να θεωρηθεί σαν «ροή πληροφορίας». Μια ροή που μπορούμε να γράφουμε ή να διαβάζουμε. Έτσι εκτός από τα συνήθη αρχεία, ως αρχεία μπορούμε να δούμε και πολλά άλλα πράγματα, όπως τις συσκευές μας. Έτσι το πληκτρολόγιο είναι ένα αρχείο η ανάγνωση τού οποίου είναι αυτά που πληκτρολογούμε και ο εκτυπωτής είναι ένα αρχείο στο οποίο στέλνουμε αυτά που θέλουμε να εκτυπωθούν, ομοίως για το μεγάφωνο, την οθόνη, το μικρόφωνο, τον σαρωτή κοκ. Στο περιεχόμενο τού αρχείο δεν συμπεριλαμβάνεται το όνομά του. Τα ονόματα τών αρχείων περιέχονται σε άλλα αρχεία που τα λέμε φακέλους, τα οποία με την σειρά τους περιέχονται σε άλλους φακέλους σχηματίζοντας έτσι το γνωστό δέντρο.

Φυσικά τα αρχεία όντας απλώς ροές πληροφορίας μπορεί να είναι ο δομικός λίθος τών πάντων αλλά δεν κάνουν κάτι. Έτσι ερχόμαστε στην δεύτερη κατηγορία που είναι οι διεργασίες. Αυτές είναι ουσιαστικά τα προγράμματα που τρέχουν στον υπολογιστή κάνοντας δουλειές όπως να γράφουν και να διαβάζουν αρχεία ή να ξεκινάνε νέες διεργασίες. Για να κάνουν όμως οττιδήποτε πρέπει να βασιστούν στον πυρήνα. Αυτό γίνεται μέσω τών κλήσεων συστήματος. Ας το δούμε αυτό με την βασική γλώσσα προγραμματισμού τού unix, την C.

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main() {
        printf("Hello World!\n");
}

Το #include <stdio.h> είναι για να έχουμε την δυνατότητα να χρησιμοποιήσουμε τις κλήσεις συστήματος που αφορούν την στάνταρ είσοδο-έξοδο. Το άλλο ενδιαφέρον στοιχείο είναι ότι ορίζουμε την «συνάρτηση» main να επιστρέφει ακέραιο (int). Ο λόγος που υπάρχει αυτό είναι επειδή στο unix κάθε διεργασία όταν τερματίζει επιστρέφει μια ακέραια τιμή. Η σύμβαση είναι να επιστρέφει μηδέν αν τερματίζει χωρίς σφάλμα και κάποια άλλη τιμή αν τερματίζει με σφάλμα. Τι μπορεί να σημαίνει η κάθε τιμή αφήνεται να το ορίσει το κάθε συγκεκριμένο πρόγραμμα. Στο παραπάνω «χαίρε, κόσμε» αμελήσαμε αυτήν την λεπτομέρεια. Το πρόγραμμά μας από αυτήν την άποψη δεν είναι «σωστό». Από τον φλοιό μπορούμε πάντα να δούμε την τιμή τής τελευταίας επιστροφής με:
Κώδικας: Επιλογή όλων
echo $?

Στον δικό μου υπολογιστή αν το συμπιλίσω και το τρέξω με:
Κώδικας: Επιλογή όλων
gcc hello.c -o hello
./hello

επιστρέφει την μυστήρια τιμή 13 που δεν είναι 0.
αυτό σημαίνει ότι αν δώσω:
Κώδικας: Επιλογή όλων
./hello && echo good

το δεύτερο σκέλος δεν θα τρέξει!

Η απλούστερη ιδέα είναι να τού πούμε να επιστρέψει 0. Έτσι θα μπορούσαμε να γράψουμε:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main() {
        printf("Hello World!\n");
        return 0;
}

Τώρα επιστρέφει 0 όπως αναμένουμε. Όμως ούτε αυτό είναι ακριβώς σωστό! Ο λόγος είναι ότι δεν εξετάσαμε αν υπήρξε σφάλμα. Το πρόγραμμά μας θα επιστρέψει 0 είτε εκτελεστεί σωστά είτε όχι! Εγώ δεν ξέρω αρκετά καλά C για να γράψω το πρόγραμμα σωστά αλλά μπορούμε να πάρουμε μια πρόταση για το σωστό από http://boredzo.org/helloworld/
Κώδικας: Επιλογή όλων
#include <stdlib.h>
#include <stdio.h>
#include <sys/errno.h>
#include <string.h>

int main(void) {
        int success = fputs("Hello World!\n", stdout);
        if(success != EOF) {
                success = fflush(stdout);
                if(success != EOF)
                        return EXIT_SUCCESS;
        }

        fprintf(stderr, "ERROR: fputs did not succeed in writing our message string (error returned: %s)!\n", strerror(errno));
        return EXIT_FAILURE;
}

Προσωπικά έχω μια καλύτερη πρόταση. Αποφύγετε την C ;)
Ξέχασα επίσης να αναφέρω ότι υπάρχει αντιστοιχία διεργασιών με αρχεία/φακέλους στον φάκελο /proc

Οι «κλήσεις συστήματος» είναι η πραγματική διεπαφή τού πυρήνα (και όχι ο «φλοιός» που είναι ένα πρόγραμμα όπως τα άλλα). Και δεν είναι ακριβές να πούμε τις πούμε «εντολές». Ο πυρήνας έχει τον έλεγχο τού υλικού και δεν δέχεται «εντολές»! Τον «καλούμε» να κάνει μια δουλειά. Ο πυρήνας μπορεί να την κάνει ή μπορεί να μην την κάνει ή μπορεί να κάνει κάτι άλλο. (κάτι σαν τον δεντροπύραυλο στο Saga) Οι λόγοι μπορούν να ποικίλουν αλλά ο πιο σημαντικός έχει να κάνει με τις άδειες.

Και ερχόμαστε έτσι στην τρίτη κατηγορία, τούς χρήστες. Τούς χρήστες συχνά τούς συνδέουμε με τούς ανθρώπους αλλά στο unix είναι μια πολύ πιο αφηρημένη έννοια που αφορά τις άδειες και ο «χρήστης» δεν είναι ακριβώς αναγκαίο να αντιστοιχεί σε άνθρωπο . Κάθε διεργασία έχει έναν «ιδιοκτήτη» και κάθε αρχείο έχει άδειες που αφορούν τον ιδιοκτήτη, την ομάδα και τούς άλλους σε σχέση με την ανάγνωση, την εγγραφή και την εκτέλεση. Ο πυρήνας θα αρνηθεί να εκτελέσει κλήσεις από διεργασίες τών οποίων ο ιδιοκτήτης δεν έχει την απαιτούμενη άδεια.


Έκανα μια πρώτη προσπάθεια να εξηγήσω το unix με απλά λόγια. Όποιος κατέχει το θέμα καλύτερα από μένα ευχαρίστως να βοηθήσει.

Re: Δομή unix-οειδών

ΔημοσίευσηΔημοσιεύτηκε: 14 Φεβ 2013, 19:57
από Ilias95
lucinos έγραψε:Προσωπικά έχω μια καλύτερη πρόταση. Αποφύγετε την C ;)

Εντάξει, αυτό έτσι γενικά και αόριστα νομίζω δεν χρειαζόταν.

Re: Δομή unix-οειδών

ΔημοσίευσηΔημοσιεύτηκε: 20 Νοέμ 2014, 12:04
από Andersan143
Από το TED talks , ο Ντον Τάπσκοτ δίνει μια ομιλία για έναν πιο ανοιχτό κόσμο και παραδείγματα επιτυχίας όσων το εφήρμοσαν.