Ανακατεύθυνση και λάθη εκτέλεσης

Μερικές φορές χρειάζεται να ανακατευθύνουμε την έξοδο ενός προγράμματος 
από τη συσκευή stdout προς κάποιο αρχείο. Έστω οτι το όνομα του εκτελέσιμου 
προγράμματος είναι ONE.EXE και το όνομα του αρχείου υποδοχής είναι 
SINK.DAT. Τότε στη προτροπή του DOS γράφουμε

C:\> ONE > SINK.DAT

Αντίστοιχα, η είσοδος των δεδομένων μπορεί να γίνεται μέσω καποιου άλλου 
αρχείου αντί από το πληκτρολόγιο. Ελαν το όνομα του αρχείου αποστολής είναι 
SOURCE.DAT τότε στη προτροπή του DOS γράφουμε

C:\> ONE < SOURCE.DAT

Φυσικά και οι δύο ανακατευθύνσεις μπορεί να συμβούν ταυτόχρονα. 

C:\> ONE < SOURCE.DAT > SINK.DAT

Τελικά μπορεί το πρόγραμμα ONE.EXE να στέλνει την έξοδό του ως είσοδο σε 
άλλο πρόγραμμα TWO.EXE και, προαιρετικά να υπάρχει και ανακατεύθυνση της 
αρχικής εισόδου ή/και της τελικής εξόδου.

C:\> ONE | TWO < SOURCE.DAT > SINK.DAT

Η σωλήνωση μπορεί να περιλάβει φυσικά περισσότερα από δύο προγράμματα στη 
σειρά. Αυτό είναι πολύ συνηθισμένο σε περιβάλλον Unix και εξηγεί τη λιτή 
έξοδο των περισσότερων κλήσεων στο λειτουργικό. Είναι έτοιμες γιά να γίνουν 
είσοδος σε άλλες κλήσεις λειτουργικού.

Αρκετά συχνά χρειάζεται παρά την ανακατεύθυνση της εξόδου να παραλάβουμε 
τα μηνύματα λάθους στην οθόνη. Το πρόγραμμα που ακολουθεί δίνει ένα τέτοιο 
παράδειγμα.  

Το πρόγραμμα ουσιαστικά περιέχει δύο εκτυπώσεις μηνυμάτων. Η πρώτη 
πρόταση χρησιμοποιεί τη γνωστή κλήση της συνάρτησης printf. Η δεύτερη 
κλήση περιέχει τη συνάρτηση fprintf που είναι η γενίκευση της printf και 
συζητείται αναλυτικά στο κεφάλαιο γιά τη διαχείριση αρχείων. Αυτό που έχει 
σημασία γιά την ώρα είναι οτι η fprintf λειτουργεί ακριβώς όπως η printf 
αλλά έχει μιά επιπλέον παράμετρο που είναι το όνομα του αρχείου όπου θα 
γραφούν τα δεδομένα. Άρα μπορούμε να πούμε οτι 

η κλήση  printf("..."); αντιστοιχεί με την κλήση fprintf(stdout, "...");

Προσέξτε το όνομα του αρχείου εξόδου της fprintf: είναι η τρίτη βασική 
συσκευή που ορίζει η C και ονομάζεται stderr (STandarD ERRor). Εξ΄ ορισμού η 
συσκευή stderr είναι η οθόνη δηλαδή ταυτίζεται με τη stdout. Επομένως τα 
μηνύματα των δύο εκτυπώσεων εμφανίζονται κατ' αρχή στην οθόνη. Ας 
αγνοήσουμε προς στιγμή τα υπόλοιπα παράξενα του προγράμματος και ας το 
εκτελέσουμε. Το αποτέλεσμα που θα πάρουμε είναι:

This line goes to the standard output.
This line goes to the error device.
This line goes to the standard output.
This line goes to the error device.
This line goes to the standard output.
This line goes to the error device.
This line goes to the standard output.
This line goes to the error device.
This line goes to the standard output.
This line goes to the error device.
This line goes to the standard output.
This line goes to the error device.

Ας ξαναεκτελέσουμε τώρα το ίδιο πρόγραμμα με ανακατεύθυνση εξόδου. Το 
όνομα του εκτελέσιμου είναι SPECIAL.EXE  και έστω ένα αρχείο STUFF που θα 
συλλέξει το αποτέλεσμα.

C:\> SPECIAL > STUFF

Αυτή τη φορά μόνο η stderr κατευθλυνεται στην οθόνη ενώ η stdout 
κατευθύνεται στο αρχείο STUFF. Στην οθόνη θα έχουμε

This line goes to the error device.
This line goes to the error device.
This line goes to the error device.
This line goes to the error device.
This line goes to the error device.
This line goes to the error device.

Ενώ αν ελέγξουμε το αρχείο STUFF θα δούμε οτι περιέχει τα μηνύματα

This line goes to the standard output.
This line goes to the standard output.
This line goes to the standard output.
This line goes to the standard output.
This line goes to the standard output.
This line goes to the standard output.

Το αρχείο STUFF θα δημιουγηθεί από το σύστημα ακόμη και αν δεν υπάρχει στο 
κατάλογό σας.
Η πρόταση EXIT

Το πρόγραμμά μας περιέχει μιάν ακόμη παραξενιά, τη πρόταση exit. Η πρόταση 
αυτή μπορεί να χαρακτηριστεί ένα είδος return του κυρίως προγράμματος, 
δηλαδή της συνάρτησης main. Θα έχετε ίσως ήδη προσέξει οτι μπροστά από τη 
λέξη main δεν έχουμε τη λέξη void αλλά τη λέξη int, πράγμα που σημαίνει οτι 
το πρόγραμμά μας επιστρέφει μιάν ακέραια τιμή στο λειτουργικό σύστημα. Η 
πρόταση exit μπορεί να συνοδεύεται από έναν αριθμό από το 0 έως το 9 μέσα σε 
παρενθέσεις. Ο αριθμός αυτός επιστρέφεται στο DOS. Το DOS μπορεί να ελέγξει 
τον αριθμό αυτό εάν καλέσει το πρόγραμμα μέσα από ένα αρχείο δέσμης που 
περιέχει την την εντολή ERRORLEVEL.

Ένα απλό παράδειγμα αρχείου δέσμης δίνεται αμέσως

SPECIAL > STUFF
IF ERRORLEVEL 4 GOTO DONE
GOTO END
:DONE
TYPE STUFF
:END

Εάν ονομάσουμε αυτό το αρχείο SPECIAL.BAT και εκτελέσουμε το πρόγραμμά 
μας με την εντολή 

C:\> SPECIAL.BAT

τότε θα εμαφανιστούν στην οθόνη διαδοχικά τα αποτελέσματα από τη stderr και 
από το αρχείο STUFF. 

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

Περιεχόμενα Κεφαλαίου