Εκτέλεση κλήσης συστήματος στο C

Exec System Call C



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

Σε αυτό το άρθρο, θα μιλήσω για την οικογένεια λειτουργιών exec και θα σας δείξω πώς να χρησιμοποιήσετε κάθε μία από αυτές τις λειτουργίες οικογένειας exec στο C. Έτσι, ας ξεκινήσουμε.







Λειτουργίες συστήματος C στην οικογένεια Exec:

Οι οικογένειες συνάρτησης exec ορίζονται στην κεφαλίδα unistd.h Το Έτσι, πρέπει να χρησιμοποιήσετε αυτήν την κεφαλίδα στο πρόγραμμα C όπου θέλετε να χρησιμοποιήσετε αυτές τις λειτουργίες.



Οι διαθέσιμες συναρτήσεις exec μαζί με τις παραμέτρους λειτουργίας τους δίνονται παρακάτω:



  • int execl (const char *path, const char *arg,…, NULL);
  • int execlp (αρχείο const char *αρχείο, const char *arg,…, NULL);
  • int execv (const char *διαδρομή, char *const argv []);
  • int execvp (const char *αρχείο, char *const argv []);
  • int execle (const char *path, const char *arg,…, NULL, char *const envp []);
  • int execve (const char *αρχείο, char *const argv [], char *const envp []);

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





execl () Λειτουργία συστήματος:

Στο execl () η λειτουργία συστήματος παίρνει τη διαδρομή του εκτελέσιμου δυαδικού αρχείου (δηλ. / bin / ls ) ως πρώτο και δεύτερο επιχείρημα. Στη συνέχεια, τα επιχειρήματα (δηλ. , /Σπίτι ) που θέλετε να περάσετε στο εκτελέσιμο ακολουθούμενο από ΜΗΔΕΝΙΚΟ Το Στη συνέχεια, η λειτουργία συστήματος execl () εκτελεί την εντολή και εκτυπώνει την έξοδο. Εάν παρουσιαστεί κάποιο σφάλμα, τότε το execl () επιστρέφει -1. Διαφορετικά, δεν επιστρέφει τίποτα.

Σύνταξη:

intεκτ(const απανθρακώνω *μονοπάτι, const απανθρακώνω *θυμωμένος,...,ΜΗΔΕΝΙΚΟ)?

Ένα παράδειγμα της λειτουργίας του συστήματος execl () δίνεται παρακάτω:



#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *binaryPath= ' / bin / ls'?
απανθρακώνω *arg1= '-lh'?
απανθρακώνω *arg2= '/Σπίτι'?

εκτ(binaryPath,binaryPath,arg1,arg2,ΜΗΔΕΝΙΚΟ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Έτρεξα το ls -lh / σπίτι εντολή χρησιμοποιώντας τη λειτουργία συστήματος execl (). Όπως μπορείτε να δείτε, εμφανίζεται το σωστό αποτέλεσμα.

execlp () Λειτουργία συστήματος:

execl () δεν χρησιμοποιεί το ΜΟΝΟΠΑΤΙ μεταβλητή περιβάλλοντος. Έτσι, απαιτείται η πλήρης διαδρομή του εκτελέσιμου αρχείου για την εκτέλεσή του με execl (). execlp () χρησιμοποιεί τη μεταβλητή περιβάλλοντος PATH. Έτσι, εάν ένα εκτελέσιμο αρχείο ή εντολή είναι διαθέσιμο στο PATH, τότε η εντολή ή το όνομα αρχείου είναι αρκετά για να το εκτελέσετε, δεν απαιτείται η πλήρης διαδρομή.

Σύνταξη:

intexeclp(const απανθρακώνω *αρχείο, const απανθρακώνω *θυμωμένος,...,ΜΗΔΕΝΙΚΟ)?

Μπορούμε να ξαναγράψουμε το παράδειγμα execl () χρησιμοποιώντας τη λειτουργία συστήματος execlp () ως εξής:

#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *όνομα προγράμματος= 'ls'?
απανθρακώνω *arg1= '-lh'?
απανθρακώνω *arg2= '/Σπίτι'?

execlp(όνομα προγράμματος,όνομα προγράμματος,arg1,arg2,ΜΗΔΕΝΙΚΟ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Πέρασα μόνο το όνομα της εντολής ls , όχι το πλήρες μονοπάτι / bin / ls Το Όπως μπορείτε να δείτε, είχα την ίδια έξοδο όπως πριν.

execv () Λειτουργία συστήματος:

Στη συνάρτηση execl (), οι παράμετροι του εκτελέσιμου αρχείου μεταφέρονται στη συνάρτηση ως διαφορετικά ορίσματα. Με το execv (), μπορείτε να περάσετε όλες τις παραμέτρους σε έναν τερματισμένο πίνακα NULL argv Το Το πρώτο στοιχείο του πίνακα πρέπει να είναι η διαδρομή του εκτελέσιμου αρχείου. Διαφορετικά, η συνάρτηση execv () λειτουργεί ακριβώς όπως η συνάρτηση execl ().

Σύνταξη:

intexecv(const απανθρακώνω *μονοπάτι, απανθρακώνω *constargv[])?

Μπορούμε να ξαναγράψουμε το παράδειγμα execl () ως εξής:

#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *binaryPath= ' / bin / ls'?
απανθρακώνω *αψίδες[] = {binaryPath, '-lh', '/Σπίτι',ΜΗΔΕΝΙΚΟ}?

execv(binaryPath,αψίδες)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Όπως μπορείτε να δείτε, έχω τη σωστή έξοδο.

execvp () Λειτουργία συστήματος:

Λειτουργεί με τον ίδιο τρόπο όπως η λειτουργία συστήματος execv (). Αλλά, χρησιμοποιείται η μεταβλητή περιβάλλοντος PATH. Έτσι, η πλήρης διαδρομή του εκτελέσιμου αρχείου δεν απαιτείται ακριβώς όπως στο execlp ().

Σύνταξη:

intexecvp(const απανθρακώνω *αρχείο, απανθρακώνω *constargv[])?

Μπορούμε να ξαναγράψουμε το παράδειγμα execv () ως εξής:

#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *όνομα προγράμματος= 'ls'?
απανθρακώνω *αψίδες[] = {όνομα προγράμματος, '-lh', '/Σπίτι',ΜΗΔΕΝΙΚΟ}?

execvp(όνομα προγράμματος,αψίδες)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Όπως μπορείτε να δείτε, εμφανίζεται η σωστή έξοδος.

execle () Λειτουργία συστήματος:

Λειτουργεί ακριβώς όπως το execl (), αλλά μπορείτε να παρέχετε τις δικές σας μεταβλητές περιβάλλοντος μαζί με αυτό. Οι μεταβλητές περιβάλλοντος περνούν ως πίνακας περιτ Το Το τελευταίο στοιχείο του περιτ Ο πίνακας πρέπει να είναι NULL. Όλα τα άλλα στοιχεία περιέχουν ζεύγη κλειδιού-τιμής ως συμβολοσειρά.

Σύνταξη:

intεκτέλεση(const απανθρακώνω *μονοπάτι, const απανθρακώνω *θυμωμένος,...,ΜΗΔΕΝΙΚΟ, απανθρακώνω * constπεριτ[] )?

Ένα παράδειγμα της λειτουργίας συστήματος execle () δίνεται παρακάτω:

#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *binaryPath= '/bin/bash'?
απανθρακώνω *arg1= '-ντο'?
απανθρακώνω *arg2= 'πέταξε έξω 'Επισκεφτείτε το $ HOSTNAME:$ PORT από το πρόγραμμα περιήγησής σας.''?
απανθρακώνω *constenv[] = {'HOSTNAME = www.linuxhint.com', 'ΛΙΜΑΝΙ = 8080',ΜΗΔΕΝΙΚΟ}?

εκτέλεση(binaryPath,binaryPath,arg1,arg2,ΜΗΔΕΝΙΚΟ,env)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Πέρασα δύο μεταβλητές περιβάλλοντος HOSTNAME και ΛΙΜΑΝΙ στη συνάρτηση execle (). Όπως μπορείτε να δείτε, μπορώ να έχω πρόσβαση σε αυτά από το εκτελέσιμο /bin/bash Το

execve () Λειτουργία συστήματος:

Ακριβώς όπως το execle () μπορείτε να παρέχετε τις δικές σας μεταβλητές περιβάλλοντος μαζί με το execve (). Μπορείτε επίσης να περάσετε ορίσματα ως πίνακες όπως κάνατε στο execv ().

Σύνταξη:

intεκτελώ(const απανθρακώνω *αρχείο, απανθρακώνω *constargv[], απανθρακώνω *constπεριτ[])?

Το παράδειγμα execle () μπορεί να ξαναγραφεί ως εξής:

#περιλαμβάνω

intκύριος(κενός) {
απανθρακώνω *binaryPath= '/bin/bash'?
απανθρακώνω *constαψίδες[] = {binaryPath, '-ντο', 'πέταξε έξω 'Επισκεφτείτε το $ HOSTNAME:$ PORT
από το πρόγραμμα περιήγησής σας.'',ΜΗΔΕΝΙΚΟ}?
απανθρακώνω *constenv[] = {'HOSTNAME = www.linuxhint.com', 'ΛΙΜΑΝΙ = 8080',ΜΗΔΕΝΙΚΟ}?

εκτελώ(binaryPath,αψίδες,env)?

ΕΠΙΣΤΡΟΦΗ 0?
}

Όπως μπορείτε να δείτε, έχουμε την ίδια έξοδο όπως στο παράδειγμα execle ().

Έτσι, έτσι χρησιμοποιείτε την οικογένεια λειτουργιών exec στο C για προγραμματισμό συστήματος στο Linux. Ευχαριστώ που διαβάσατε αυτό το άρθρο.