Ανακατεύθυνση και λάθη εκτέλεσης |
Μερικές φορές χρειάζεται να ανακατευθύνουμε την έξοδο ενός προγράμματος από τη συσκευή 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. Οι μεταφραστές, συνδετές, φορτωτές και συστήματα εκτέλεσης επιστρέφουν αριθμούς λαθών στις διάφορες φάσεις επεξεργασίας του προγράμματος. Βέβαια εάν δουλεύει κανείς σε ολοκληρωμένο περιβάλλον αυτές οι επιστροφές ελέγχονται από το περιβάλλον αλλά σε πιό αφιολόξενα λειτουργικά η μετάφρση μέσα από αρχεία δέσμης είναι ιδιαίτερα χρήσιμη. |
![]() |
![]() |
![]() |