Προς το περιεχόμενο

Εργασία προσομοίωσης εντολών DOS σε C


sarakinos

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παίδες...έχω μια εργασία για την δημιουργεία ενός console app που θα εκτελεί τις εντολές dir,cls,ver,exit του dos μέσω ενός προγράμματος γραμμένου σε c...ο καθηγητής μου είπε ότι είναι καλό να μην την κάνω με την system(""); αλλά να ψάξω για δικό μου κώδικα...μπορείτε μήπως να με βοηθήσετε ?δεν ενωώ να μου την κάνετε , αλλά να μου πείτε που πρέπει να ψάξω , για ποια θέματα δηλαδή γιατί από το google που εκανα βρήκα μόνο την μέθοδο με την system(""); ... thanks in advance

Δημοσ.

Για την εντολή dir μπορείς να βασισθείς στις POSIX ρουτίνες (βιβλιοθήκη dirent.h) opendir, readdir και closedir οι οποίες οφείλουν να λειτουργούν με τον ίδιο τρόπο σε κάθε λειτουργικό σύστημα.

 

Για την cls επειδή έχει να κάνει με καθαρισμό οθόνης πράγμα που δεν καλύπτεται από το πρότυπο ANSI - C τα πράγματα δυσκολεύουν οπότε θα πρέπει να δεις τι βιβλιοθήκες, ρουτίνες σου παρέχει ο compiler σου για αυτή την δουλεία, για περισσότερα διάβασε σε αυτό το θέμα όπου ασχοληθήκαμε αρκετά άτομα με αυτό το ζήτημα (και προτάθηκαν διάφορες λύσεις).

 

Η ver είναι πολύ απλά, ένα printf και ένα string με την έκδοση του CLI σου (πχ. My Command Line 1.0) και είσαι ok.

 

Το exit απλά τερματίζει το πρόγραμμα σου, διακόπτοντας το loop που θα στήσεις για το parsing των εντολών, δεν θεωρώ ότι θα σε προβληματίσει (εκτός και αν θες κάτι άλλο με την exit -??).

 

Από εκεί και πέρα θα χρειασθεί να γράψεις ένα πολύ απλό parser που θα διαβάζει από το πληκτρολόγιο την είσοδο του χρήστη (δες για παράδειγμα ρουτίνα fgets και stdin –κλασσική λύση) και ύστερα θα δοκιμάζει να την ταιριάξει με κάποια από τις παραπάνω (δες strcmp). Τώρα αν θες να περνάς και παραμέτρους (πχ. dir c:) εκεί τα πράγματα μπορεί να θέλουν λίγο περισσότερο ψάξιμο ώστε να διαχωρίζεις την εντολή από τις παραμέτρους (για κοίταξε προς strncmp, strtok, sscanf μεριά -εδώ υπάρχουν πολλές προτάσεις και μέθοδοι, εξαρτάται πως θες να το κάνεις το parsing, πως σου αρέσει κτλ.. θα το βρεις στην πορεία) από την γραμμή εισόδου του χρήστη στέλλοντας τις στις ρουτίνες που θα υλοποιούν τις εντολές (με ότι αυτό συνεπάγεται).

 

Γενικά, νομίζω ότι με λίγο ψάξιμο θα την βγάλεις την άσκηση άνετα.

 

Καλή τύχη!

:-)

 

Υ.Γ.

Βέβαια ο καθηγητής σου δεν θέλει system("") .. το νόημα είναι να γράψεις ένα πολύ απλό parser σε στυλ MS-DOS "command.com" με υλοποίηση μερικών απλών εντολών.

Δημοσ.

Σας ευχαριστώ παίδες!Κατατοπιστικότατοι!Οσο για την exit , θέλω να κλείνει το cmd.exe ... διαβασα κάτι για kill signals...το σωστό θέμα ψάχνω?Kαι ως ver εννοω την version των windows...λίγο ποιο κατατοπιστικός σαυτο αν μπορεις...

Δημοσ.
Σας ευχαριστώ παίδες!Κατατοπιστικότατοι!Οσο για την exit , θέλω να κλείνει το cmd.exe ... διαβασα κάτι για kill signals...το σωστό θέμα ψάχνω?Kαι ως ver εννοω την version των windows...λίγο ποιο κατατοπιστικός σαυτο αν μπορεις...

 

Για την έκδοση των Windows μπορείς να χρησιμοποιείς την ρουτίνα του Windows API (θα χρειασθείς την βιβλιοθήκη windows.h) GetVersionEx η οποία σε αντίθεση με την GetVersion επιστρέφει άμεσα το Major.Minor του Λ.Σ. στο OSVERSIONINFO struct.

 

Όσον αφορά τα signals (αν καταλαβαίνω καλά -μιλώ για Windows πάντα) αφορά την διαχείριση των ειδικών σημάτων που μπορούν να λάβουν τα προγράμματα κονσόλας κατά την εκτέλεση τους (δες ANSI-C signal από signal.h ή μέσο Windows API «SetConsoleCtrlHandle»). Για παράδειγμα ως signal εννοούμε το πάτημα των «Control+C» το οποίο εξ ορισμού διακόπτει την εκτέλεση ενός console προγράμματος βίαια οπότε εσύ γράφεις μια ρουτίνα που διαχειρίζεται όπως επιθυμείς τέτοιες καταστάσεις (υπάρχουν signals για overflow κτλ).

 

Όσον αφορά την “exit”, νομίζω ότι η καλύτερη συμπεριφορά που μπορεί να έχει είναι απλά η έξοδος της από το πρόγραμμα που έγραψες. Αν το πρόγραμμα αυτό το έχει εκκινήσει ο χρήστης από τον Explorer τότε φυσικά με την έξοδο του θα κλείσει και το ανάλογο console παράθυρο που δημιουργούν αυτόματα τα Windows. Αν το πρόγραμμα ξεκινήσει από κάποια άλλη parent εφαρμογή (λέγε με cmd.exe) ως child αυτής, με το exit του θα κλείσει μόνο τον εαυτό του και όχι την parent εφαρμογή που το ξεκίνησε, οπότε λογική συνέπεια είναι με το exit να επιστρέψεις στο cmd.exe prompt.

 

Τώρα αν θες με την exit σου να τερματίσεις μαζί με το πρόγραμμα σου (child) και το ίδιο το cmd.exe, που είναι η parent process που σε ξεκίνησε μπορείς να δοκιμάσεις διάφορες μεθόδους όπως για παράδειγμα αποστέλλοντας το standard μήνυμα κλεισίματος παραθύρου των Windows, δηλαδή το WM_CLOSE στο παράθυρο Parent της κονσόλα σου (GetConsoleWindow = το cmd.exe μοιράζει το παράθυρο του σε κάθε child), που μπορεί να είναι το cmd.exe αν έχεις εκτελεστεί από αυτό (πχ. PostMessage(GetConsoleWindow(), WM_CLOSE, 0, 0L) –μπορείς και με SendMessage βέβαια αλλά η διακοπή είναι άμεση και ενδεχομένως να μην θες κάτι τέτοιο –πχ. εκτέλεση RTL clean up code κτλ).

 

Καλή συνέχεια!

:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...