Σε Linux, επιστρέψτε το αποτέλεσμα από το exec. Man execlp (3): εκκινήστε το αρχείο για εκτέλεση. Χρήση της κλήσης συστήματος διχάλας

exec() οικογένεια συναρτήσεων

Η οικογένεια συναρτήσεων exec() αντικαθιστά το πρόγραμμα που εκτελείται στην τρέχουσα διαδικασία με ένα άλλο πρόγραμμα. Όταν ένα πρόγραμμα καλεί τη συνάρτηση exec(), η εκτέλεσή του σταματά αμέσως και ξεκινά ένα νέο πρόγραμμα.

Οι συναρτήσεις που περιλαμβάνονται στην οικογένεια exec() διαφέρουν ελαφρώς ως προς τις δυνατότητές τους και τον τρόπο κλήσης τους.

Οι συναρτήσεις με επίθημα "p" στο όνομά τους (execvp() και execlp()) λαμβάνουν το όνομα ενός προγράμματος ως όρισμα και αναζητούν αυτό το πρόγραμμα στους καταλόγους που καθορίζονται από τη μεταβλητή περιβάλλοντος PATH. Όλες οι άλλες συναρτήσεις πρέπει να περάσουν το πλήρες όνομα διαδρομής του προγράμματος.

Οι συναρτήσεις με επίθημα "v" στα ονόματά τους (execv(), execvp() και execve()) δέχονται μια λίστα ορισμάτων προγράμματος ως μια σειρά από δείκτες συμβολοσειράς, που τελειώνουν με δείκτη NULL. Οι συναρτήσεις με το επίθημα "l" (execl(), execlp() και execle()) δέχονται μια λίστα ορισμάτων μεταβλητού μήκους.

Οι συναρτήσεις με το επίθημα "e" στα ονόματά τους (execve() και execle()) λαμβάνουν έναν πίνακα μεταβλητών περιβάλλοντος ως πρόσθετο όρισμα. Αυτός ο πίνακας περιέχει δείκτες συμβολοσειράς και τελειώνει με μηδενικό δείκτη. Κάθε γραμμή πρέπει να μοιάζει με " ΜΕΤΑΒΛΗΤΟΣ=έννοια" .

Επειδή η exec() αντικαθιστά ένα πρόγραμμα με ένα άλλο, δεν επιστρέφει ποτέ μια τιμή - μόνο εάν το πρόγραμμα δεν μπορούσε να κληθεί λόγω σφάλματος.

Κατάλογος επιχειρημάτων, μεταδίδεται στο πρόγραμμα, παρόμοια με επιχειρήματα γραμμή εντολών, που καθορίζεται κατά την εκκίνηση του προγράμματος στο διαδραστική λειτουργία. Μπορούν επίσης να ληφθούν χρησιμοποιώντας τις παραμέτρους argc και argv κύριες λειτουργίες(). Θυμηθείτε, όταν ένα πρόγραμμα εκκινείται από τον διερμηνέα εντολών, το πρώτο στοιχείο του πίνακα argv θα περιέχει το όνομα του προγράμματος, ακολουθούμενο από τα ορίσματα που διαβιβάζονται στο πρόγραμμα. Θα πρέπει να κάνετε το ίδιο όταν δημιουργείτε μια λίστα ορισμάτων για τη συνάρτηση exec().

Λειτουργία Λειτουργίες που φορτώνουν και εκκινούν άλλα προγράμματα. Σύνταξη int execl(char * pathname, char * arg0, arg1, ..., argn, NULL); int execle(char * pathname, char * arg0, arg1, ..., argn, NULL, char ** envp); int execlp(char * pathname, char * arg0, arg1, ..., argn, NULL); int execlpe(char * όνομα διαδρομής, char * arg0, arg1, ..., argn, NULL, char ** envp); int execv(char * pathname, char * argv); int execve(char * pathname, char * argv, char ** envp); int execvp(char * pathname, char * argv); int execvpe(char * pathname, char * argv, char ** envp); Αρχείο που περιέχει το πρωτότυπο process.h Περιγραφή Η οικογένεια συναρτήσεων exec... φορτώνει και εκτελεί άλλα προγράμματα, γνωστά ως "παιδικές" διεργασίες. Εάν η κλήση συνάρτησης exec... επιτύχει, η διεργασία "παιδί" υπερτίθεται στη διαδικασία "γονική". Επιπλέον, πρέπει να υπάρχει αρκετή μνήμη για τη φόρτωση και εκτέλεση της διαδικασίας «παιδιού». pathname είναι το όνομα αρχείου της καλούμενης διαδικασίας "child". Οι λειτουργίες exec... αναζητούν όνομα διαδρομής χρησιμοποιώντας τον τυπικό αλγόριθμο συστήματος DOS: - Χωρίς επέκταση όνομα αρχείουκαι δεν εχει νόημα? Σε αυτήν την περίπτωση, γίνεται αναζήτηση του ακριβούς ονόματος αρχείου, εάν δεν βρεθεί ένα τέτοιο όνομα, προστίθεται η επέκταση .com και η αναζήτηση συνεχίζεται. Εάν δεν βρεθεί τέτοιο αρχείο, τότε προστίθεται η επέκταση .exe και η αναζήτηση εκτελείται για τελευταία φορά. - Υπάρχει η επέκταση ονόματος - πραγματοποιείται αναζήτηση χρησιμοποιώντας το ακριβές όνομα αρχείου. Οι καταλήξεις l, v, p και e που προστέθηκαν στο exec... οικογενειακό όνομα το δηλώνουν αυτή τη λειτουργίαθα λειτουργήσει με ορισμένα χαρακτηριστικά: p - καθορίζει ότι η συνάρτηση θα αναζητήσει ένα πρόγραμμα "παιδί" στους καταλόγους που ορίζονται από τη μεταβλητή περιβάλλον DOSΜΟΝΟΠΑΤΙ. Χωρίς το επίθημα p, η αναζήτηση θα γίνει μόνο στον κατάλογο εργασίας. Εάν η παράμετρος διαδρομής δεν περιέχει διαδρομή, τότε η αναζήτηση εκτελείται στον τρέχοντα κατάλογο και, στη συνέχεια, κατά μήκος των διαδρομών που ορίζονται από τη μεταβλητή περιβάλλοντος PATH. l - υποδεικνύει ότι οι δείκτες διεύθυνσης (arg0, arg1, ..., argn) μεταβιβάζονται ως ξεχωριστά ορίσματα. Συνήθως, το επίθημα l χρησιμοποιείται όταν γνωρίζετε τον αριθμό των ορισμάτων που πρέπει να διαβιβαστούν εκ των προτέρων. v - υποδηλώνει ότι οι δείκτες διευθύνσεων (arg, arg,...arg[n]) μεταβιβάζονται ως πίνακας δεικτών. Συνήθως, το επίθημα v χρησιμοποιείται κατά τη μετάδοση μεταβλητός αριθμόςεπιχειρήματα. e - υποδεικνύει ότι στη διαδικασία "παιδί" μπορεί να περάσει ένα όρισμα envp, το οποίο σας επιτρέπει να επιλέξετε το περιβάλλον της διαδικασίας "παιδί". Χωρίς το επίθημα e, η διαδικασία "παιδί" θα κληρονομήσει το περιβάλλον της διαδικασίας "γονέας". Κάθε συνάρτηση exec... οικογένειας πρέπει να έχει ένα από τα δύο επιθήματα που καθορίζουν ορίσματα (είτε l είτε v). Ορισμός διαδρομής (PATH) και επιθήματα κληρονομιάς λειτουργικό περιβάλλον(σ και ε) είναι προαιρετικά. Για παράδειγμα: - execl - είναι μια συνάρτηση της οικογένειας exec... που περνά ξεχωριστά ορίσματα, αναζητά μια διεργασία "παιδί" μόνο στον κατάλογο εργασίας και μεταβιβάζει το περιβάλλον "γονικό" στη διαδικασία "παιδί". - Το execvpe είναι μια συνάρτηση της οικογένειας exec... που περνά έναν πίνακα δεικτών ορισμάτων, επισυνάπτει μια διαδρομή πρόσβασης PATH για να βρει τη διαδικασία "παιδί" και χρησιμοποιεί το όρισμα envp για να επιλέξει το περιβάλλον της διαδικασίας "παιδί". Η συνάρτηση exec... οικογένεια πρέπει να περάσει τουλάχιστον ένα όρισμα (arg0 ή argv) στη διαδικασία "παιδί". Αυτό το όρισμα είναι, κατά σύμβαση, ένα αντίγραφο του ονόματος διαδρομής. (Η χρήση άλλων τιμών για το όρισμα null δεν θα είναι σφάλμα.) Σε συστήματα εκδόσεις DOS 3.Χ μια "θυγατρική" διαδικασία μπορεί να λάβει ένα όρισμα μονοπατιού. σε περισσότερα προηγούμενες εκδόσειςΗ διαδικασία "παιδί" δεν μπορεί να χρησιμοποιήσει την τιμή του μηδενικού ορίσματος (arg0 ή argn). Όταν χρησιμοποιείτε το επίθημα l, το arg0 συνήθως δείχνει στο όνομα διαδρομής και το arg1, ..., το argn δείχνει στις συμβολοσειρές χαρακτήρων που σχηματίζονται νέα λίσταεπιχειρήματα. Ένα τερματικό NULL που ακολουθεί το argn σηματοδοτεί το τέλος της λίστας. Όταν χρησιμοποιείται το επίθημα e, μεταβιβάζεται μια λίστα με το καθορισμένο περιβάλλον χρησιμοποιώντας το όρισμα envp. Αυτό το όρισμα είναι ένας πίνακας στοιχείων char*. Κάθε στοιχείο δείχνει σε μια συμβολοσειρά χαρακτήρων με μηδενικό τερματισμό της μορφής: envvar = τιμή , όπου envvar είναι το όνομα μεταβλητή περιβάλλοντος, και η αξία είναι η τιμή συμβολοσειρά χαρακτήρων, το οποίο εκχωρείται σε κάθε μεταβλητή envvar. Το τελευταίο στοιχείοστον πίνακα envp η διεύθυνση μηδέν είναι NULL. Όταν το envp είναι NULL, η διαδικασία "παιδί" κληρονομεί τις εκχωρήσεις περιβάλλοντος της διαδικασίας "γονέα". Το συνολικό μήκος του arg0+ arg1+...+argn (ή arg+ arg+...+arg[n]), συμπεριλαμβανομένων των διαστημάτων που χωρίζουν τα ορίσματα, πρέπει να είναι μικρότερο από 128 byte. Οι μηδενικές καταλήξεις δεν υπολογίζονται. Όταν το exec... ονομάζεται, οποιοδήποτε ανοιχτά αρχείαπαραμείνετε ανοιχτοί στη διαδικασία του «παιδιού». Επιστράφηκε Με την επιτυχή ολοκλήρωση της συνάρτησης exec..., δεν επιστρέφεται καμία τιμή. Εάν παρουσιαστεί σφάλμα, οι συναρτήσεις exec... επιστρέφουν -1 και η καθολική μεταβλητή errno ορίζεται σε μία από τις παρακάτω τιμές: E2BIG - Η λίστα ορισμάτων είναι πολύ μεγάλη. EACCES - Δεν επιτρέπεται η πρόσβαση. EMFILE - Πάρα πολλά ανοιχτά αρχεία. ENOENT - Η διαδρομή πρόσβασης (PATH) ή το όνομα αρχείου δεν βρέθηκε. ENOEXEC - Σφάλμα μορφής EXEC. ENOMEM - Δεν υπάρχει αρκετή μνήμη. Η φορητότητα του exec... είναι μοναδική στο DOS. Δείτε επίσης: abort, atexit,_exit, exit, _fpreset, search path, spawn..., system. Παράδειγμα: #include #περιλαμβάνω main(int argc, char * argv) ( int i; printf("Θυγατρική διεργασία που εκτελείται...\n"); printf("%s\n",getenv("PATH")); για (i=0; Εγώ #περιλαμβάνω #περιλαμβάνω int main(int argc,char *argv) ( int loop; printf("%s εκτελείται...\n\n",argv); if(argc == 1) /* υπάρχουν άλλα ορίσματα */ ( printf( "%s ξεκινά ξανά...\n",argv, execl(argv,argv,"ONE","TWO","THREE",NULL("EXEC:"); ) printf("%); καλείται με ορίσματα:\n",argv); for(loop = 1;loop)<=argc;loop++) puts(argv); return 0; } #include#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω int main(int argc,char *argv) ( int loop; char *new_env = ("TELYING",NULL); printf("%s λειτουργεί...\n\n",argv); if(argc == 1 ) /* υπάρχουν άλλα ορίσματα */ ( printf("%s εκτελείται ξανά...\n",argv); execle(argv,argv,"ONE","TWO","THREE",NULL, new_env ) ;<=argc;loop++) puts(argv); /* напечатать первый параметр среды */ printf("env = %s\n",env); return 0; } #include#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω int main(int argc,char *argv) ( int loop; printf("%s εκτελείται...\n\n",argv); if(argc == 1) /* υπάρχουν άλλα ορίσματα */ ( printf( "%s ξεκινά ξανά...\n",argv, execlp(argv,argv,"ONE","TWO","THREE",NULL("EXEC:"); ) printf("%); καλείται με ορίσματα:\n",argv); for(loop = 1;loop)<=argc;loop++) puts(argv); return 0; } #include#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void main(int argc,char *argv,char **envp) ( printf("Start CHILD with arg1, arg2 ...\n"); execlpe("CHILD.EXE","CHILD.EXE","arg1" "arg2",NULL,envp("σφάλμα EXEC"); #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void main(int argc,char **argv) ( printf("Starting CHILD with arg1, arg2 ...\n"); execv("CHILD.EXE",argv); error("EXEC error"); exit( 1) ) #include #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void main(int argc,char **argv,char **envp) ( printf("Start CHILD με arg1, arg2 ...\n"); execve("CHILD.EXE",argv,envp); error(" Σφάλμα EXEC"); exit(1); ) #include #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void main(int argc,char **argv) ( printf("Starting CHILD with arg1, arg2 ...\n"); execvp("CHILD.EXE",argv); error("EXEC error"); exit( 1) ) #include #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω int main(int argc,char **argv,char **envp) ( printf("Start CHILD με arg1, arg2 ...\n"); execvpe("CHILD.EXE",argv,envp); σφάλμα(" Σφάλμα EXEC"); exit(1); )

Εξαιρ (3) εκκίνηση ενός αρχείου για εκτέλεση

Άλλο ψευδώνυμο

execl, execle, execv, execvp, execvpe

ΑΝΑΣΚΟΠΗΣΗ

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

εξωτερικό χαρακτήρα **περιβάλλον;

int excl(const char *μονοπάτι, const char *αργ, ...
/* (char *) NULL */);
int execlp(constchar *αρχείο, const char *αργ, ...
/* (char *) NULL */);
int execle(constchar *μονοπάτι, const char *αργ, ...
/*, (χαρ *) NULL, char * constenvp */);
int execv(constchar *μονοπάτι, char *constargv);
int execvp(constchar *αρχείο, char *constargv);
int execvpe(constchar *αρχείο, char *constargv,
char *constenvp);

Απαιτήσεις για τη μακροεντολή ελέγχου ιδιοτήτων για το glibc (βλ feature_test_macros(7)):

execvpe():_GNU_SOURCE

ΠΕΡΙΓΡΑΦΗ

Οικογένεια λειτουργιών εκτελεστ() αντικαθιστά την τρέχουσα εικόνα διεργασίας με μια νέα. Οι λειτουργίες που περιγράφονται σε αυτήν τη σελίδα man είναι περιτυλίγματα για execve(2) (Για λεπτομέρειες σχετικά με την αντικατάσταση του τρέχοντος, ανατρέξτε στη σελίδα man execve(2)).

Το πρώτο όρισμα αυτών των συναρτήσεων είναι το όνομα του εκτελέσιμου αρχείου.

Παράμετρος const char *argκαι επακόλουθες παραμέτρους σε συναρτήσεις εξαιρ(), εξαιρ() Και εκτελεστής() μπορεί να θεωρηθεί ως παράμετροι arg0, arg1, ..., αργν. Μαζί περιγράφουν μια λίστα με έναν ή περισσότερους δείκτες συμβολοσειράς με μηδενικό τερματισμό που αντιπροσωπεύει μια λίστα παραμέτρων που είναι διαθέσιμες στο πρόγραμμα εκτέλεσης. Η πρώτη παράμετρος, κατά σύμβαση, θα πρέπει να δείχνει το όνομα που σχετίζεται με το αρχείο που πρόκειται να εκτελεστεί. Λίστα παραμέτρων πρέπειτελειώνει με μηδενικό δείκτη και, καθώς αυτή είναι μια συνάρτηση με μεταβλητό αριθμό ορισμάτων, αυτός ο δείκτης πρέπει να μεταφερθεί σε (χαρ *) NULL.

Λειτουργίες execv(), execvp() Και execvpe() παρέχει στο νέο πρόγραμμα μια λίστα ορισμάτων με τη μορφή ενός πίνακα δεικτών σε συμβολοσειρές με μηδενικό τερματισμό. Το πρώτο όρισμα, κατά σύμβαση, θα πρέπει να δείχνει το όνομα που σχετίζεται με το αρχείο που πρόκειται να εκτελεστεί. Πίνακας δεικτών πρέπειτελειώνει με μηδενικό δείκτη.

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

Ειδική σημασιολογία των execlp() και execvp()

Λειτουργίες εξαιρ(), execvp() Και execvpe() διπλότυπες ενέργειες φλοιού που σχετίζονται με την εύρεση ενός εκτελέσιμου αρχείου εάν το καθορισμένο όνομα αρχείου δεν περιέχει κάθετο χαρακτήρα (/). Η διαδρομή αναζήτησης καθορίζεται στο μεταβλητή περιβάλλοντος ΜΟΝΟΠΑΤΙ(λίστα καταλόγων που χωρίζονται με άνω και κάτω τελεία). Εάν αυτή η μεταβλητή δεν έχει οριστεί, τότε από προεπιλογή η λίστα των καταλόγων που επιστρέφονται προστίθεται στον τρέχοντα κατάλογο confstr(_CS_PATH)(κλήση confstr(3) συνήθως επιστρέφει "/bin:/usr/bin").

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

Επιπλέον, υπάρχουν διαφορές στον χειρισμό ορισμένων σφαλμάτων.

Εάν δεν επιτρέπεται η πρόσβαση σε ένα αρχείο (όταν προσπαθείτε να το εκτελέσετε execve(2) επιστρέφεται ένα σφάλμα EACCES), τότε αυτές οι συναρτήσεις θα συνεχίσουν την αναζήτηση στις υπόλοιπες διαδρομές. Ωστόσο, εάν δεν βρεθούν άλλα αρχεία, τότε εκχωρούν την τιμή στην καθολική μεταβλητή λάθοςίσος EACCES.

Εάν η κεφαλίδα του αρχείου δεν αναγνωρίζεται (όταν προσπαθείτε να το εκτελέσετε execve(2) επιστρέφει ENOEXEC), τότε αυτές οι συναρτήσεις εκκινούν το κέλυφος ( /bin/sh) με το πλήρες όνομα του αρχείου ως πρώτη παράμετρο (εάν αυτό επίσης οδηγήσει σε σφάλμα, η αναζήτηση σταματά).

ΑΞΙΑ ΕΠΙΣΤΡΟΦΗΣ

Λειτουργίες εκτελεστ() επιστρέψτε μια τιμή μόνο εάν παρουσιαστεί σφάλμα. Αυτό επιστρέφει -1, και λάθοςεκχωρείται ένας κωδικός σφάλματος.

ΕΚΔΟΣΕΙΣ

Λειτουργία execvpe() εμφανίστηκε για πρώτη φορά στο glibc 2.11.

ΓΝΩΡΙΣΜΑΤΑ

Για περιγραφή των όρων σε αυτήν την ενότητα, βλ γνωρίσματα(7).
Διεπαφή Χαρακτηριστικό Εννοια
εξαιρ(), εκτελεστής(), execv() ακίνδυνα στα νήματααβλαβές (MT-Safe)
εξαιρ(), execvp(), execvpe() ακίνδυνα στα νήματααβλαβές (MT-Safe env)

ΣΥΜΜΟΡΦΩΣΗ

POSIX.1-2001, POSIX.1-2008.

Λειτουργία execvpe() είναι μια επέκταση GNU.

ΣΗΜΕΙΩΣΕΙΣ

Σε ορισμένα συστήματα η προεπιλεγμένη διαδρομή αναζήτησης (χρησιμοποιείται όταν δεν υπάρχει μεταβλητή στο περιβάλλον ΜΟΝΟΠΑΤΙ) ξεκινά με καταλόγους /αποθήκηΚαι /usr/bin, και στη συνέχεια η αναζήτηση πραγματοποιείται στον τρέχοντα κατάλογο (για να μην εκκινήσει ένα ενσωματωμένο πρόγραμμα δούρειου ίππου). Το Linux χρησιμοποιεί την παραδοσιακή μέθοδο: η αναζήτηση ξεκινά από τον τρέχοντα κατάλογο.

Συμπεριφορά λειτουργίας εξαιρ() Και execvp() για σφάλματα κατά τις προσπάθειες εκτέλεσης ενός αρχείου έχει αναπτυχθεί ιστορικά, αλλά δεν περιγράφεται ούτε ορίζεται στο πρότυπο POSIX. Στο BSD (και πιθανώς σε άλλα συστήματα) υπάρχει αυτόματη αναμονή και επανάληψη εάν παρουσιαστεί σφάλμα ETXTBSY. Στο Linux, αυτό αντιμετωπίζεται ως μη ανακτήσιμο σφάλμα και επιστρέφει αμέσως.

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

EXEC(2)

ΟΝΟΜΑ
exec: execl, execv, execle, execve, execlp, εκτέλεση αρχείου execvp

ΣΥΝΤΑΞΗ

Int execl (διαδρομή, arg0, arg1, ..., argn, (char*) 0) char *path, *arg0, *arg1, ..., *argn; int execv (διαδρομή, argv) char *path, *argv ; int execle (διαδρομή, arg0, arg1, ..., argn, (char*) 0, envp) char *path, *arg0, *arg1, ..., *argn, *envp ; int execve (διαδρομή, argv, envp) char *path, *argv , *envp ; int execlp (αρχείο, arg0, arg1, ..., argn, (char*) 0) char *file, *arg0, *arg1, ..., *argn; int execvp (αρχείο, argv) char *file, *argv ;

ΠΕΡΙΓΡΑΦΗ
Όλες οι μορφές της κλήσης συστήματος exec μετατρέπουν τη διαδικασία κλήσης σε μια νέα διεργασία, η οποία δημιουργείται από ένα κανονικό εκτελέσιμο αρχείο, που στο εξής ονομάζεται νέο εκτελέσιμο αρχείο. Το εκτελέσιμο αρχείο αποτελείται από μια κεφαλίδα [βλ a.out(4)], τμήμα εντολών (.text) και δεδομένα. Τα δεδομένα αποτελούνται από ένα αρχικοποιημένο (.data) και ένα μη αρχικοποιημένο (.bss) τμήμα. Εάν η κλήση συστήματος exec επιτύχει, δεν μπορεί να επιστρέψει επειδή η διαδικασία κλήσης έχει ήδη αντικατασταθεί από μια νέα διαδικασία.

Όταν εκτελείτε ένα πρόγραμμα C, το ονομάζετε ως εξής:

Κύρια (argc, argv, envp) int argc; char **argv, **envp;

όπου το argc είναι ίσο με τον αριθμό των ορισμάτων, το argv είναι ένας πίνακας δεικτών στα ίδια τα ορίσματα και το envp είναι ένας πίνακας δεικτών στις συμβολοσειρές χαρακτήρων που σχηματίζουν το περιβάλλον. Η σύμβαση είναι ότι το argc είναι τουλάχιστον 1 και το πρώτο στοιχείο του πίνακα argv δείχνει μια συμβολοσειρά χαρακτήρων που περιέχει το όνομα του νέου εκτελέσιμου αρχείου.

Τα ορίσματα στις κλήσεις συστήματος της ομάδας exec έχουν την ακόλουθη σημασία.

Το όρισμα διαδρομής καθορίζει το όνομα διαδρομής του νέου εκτελέσιμου αρχείου.

Όπως και η διαδρομή, το όρισμα αρχείου καθορίζει ένα νέο εκτελέσιμο αρχείο, αλλά η διαδρομή του αρχείου προσδιορίζεται κοιτάζοντας τους καταλόγους που περνούν από τη μεταβλητή περιβάλλοντος PATH [βλ. περιβάλλον (5)]. Το περιβάλλον υποστηρίζεται από το κέλυφος [βλ sh(1) ].

Τα ορίσματα arg0, arg1, ..., argn είναι δείκτες σε συμβολοσειρές χαρακτήρων που οριοθετούνται με null byte. Αυτές οι αλυσίδες αποτελούν τη λίστα των ορισμάτων που είναι διαθέσιμα στη νέα διαδικασία. Κατά σύμβαση, τουλάχιστον, το arg0 πρέπει να υπάρχει και να δείχνει σε μια σειρά χαρακτήρων ίση με τη διαδρομή (ή το τελευταίο στοιχείο της διαδρομής).

Ο πίνακας argv περιέχει δείκτες σε συμβολοσειρές χαρακτήρων που οριοθετούνται με μηδέν byte. Αυτές οι αλυσίδες αποτελούν τη λίστα των ορισμάτων που είναι διαθέσιμα στη νέα διαδικασία. Κατά σύμβαση, το argv πρέπει να περιέχει τουλάχιστον το πρώτο στοιχείο που δείχνει μια συμβολοσειρά χαρακτήρων ίση με τη διαδρομή (ή το τελευταίο στοιχείο της διαδρομής). Το τελευταίο κατειλημμένο στοιχείο του πίνακα argv πρέπει να ακολουθείται από έναν μηδενικό δείκτη.

Ο πίνακας envp περιέχει δείκτες σε συμβολοσειρές χαρακτήρων που οριοθετούνται με null byte. Αυτές οι αλυσίδες αποτελούν το περιβάλλον της νέας διαδικασίας. Το τελευταίο κατειλημμένο στοιχείο του πίνακα envp πρέπει να ακολουθείται από έναν μηδενικό δείκτη.

Πριν ξεκινήσετε οποιαδήποτε εκτέλεση προγράμματος, στο εξωτερικό περιβάλλον μεταβλητής, η περιγραφή του οποίου μοιάζει

Εξωτερικό χαρακτήρα **περιβάλλον;

τοποθετείται η διεύθυνση μιας σειράς δεικτών στις συμβολοσειρές των συμβόλων που σχηματίζουν το περιβάλλον της διεργασίας. Χρησιμοποιώντας αυτήν τη μεταβλητή (καθώς και χρησιμοποιώντας το όρισμα envp στο main), μπορείτε πάντα να έχετε πρόσβαση στο περιβάλλον σε μια νέα διαδικασία, ανεξάρτητα από την έκδοση της κλήσης συστήματος exec που χρησιμοποιήθηκε. Η μόνη διαφορά είναι ότι στην περίπτωση κλήσεων execle και execve, το περιβάλλον της νέας διεργασίας καθορίζεται ρητά και σε άλλες περιπτώσεις κληρονομείται από τη διαδικασία κλήσης.

Τα αρχεία που ανοίγουν στη διαδικασία κλήσης παραμένουν ανοιχτά στη νέα διαδικασία, εκτός από αυτά που έχουν οριστεί η σημαία "close on exec" [βλ. fcntl(2)]. Εάν το αρχείο παραμείνει ανοιχτό, ο δείκτης στην τρέχουσα θέση στο αρχείο διατηρείται.

Η απόκριση στα σήματα διατηρείται, εκτός από το ότι τα σήματα που παρεμποδίστηκαν στη διαδικασία κλήσης προκαλούν τον τερματισμό της νέας διαδικασίας [βλ. σήμα (2) ].

Στην περίπτωση που η απόκριση στα σήματα ρυθμίστηκε με κλήση sigset (2)και καθορίστηκε ως SIG_DFL, SIG_IGN ή SIG_HOLD, αυτή η αντίδραση κληρονομείται από τη διαδικασία κλήσης. Ωστόσο, εάν το σήμα υποκλαπεί, τότε η απόκριση SIG_DFL τίθεται και όλα τα λαμβανόμενα αλλά όχι επεξεργασμένα σήματα αυτού του τύπου παραμερίζονται.

Εάν το νέο εκτελέσιμο αρχείο έχει οριστεί το bit άδειας για επαναφορά του τρέχοντος αναγνωριστικού χρήστη [βλ chmod(2)], τότε το πραγματικό αναγνωριστικό χρήστη της νέας διαδικασίας ορίζεται στο αναγνωριστικό κατόχου του νέου εκτελέσιμου αρχείου. Ομοίως, εάν το bit άδειας του νέου εκτελέσιμου έχει ρυθμιστεί για επαναφορά του ενεργού αναγνωριστικού ομάδας, τότε το ενεργό αναγνωριστικό ομάδας της νέας διαδικασίας ορίζεται στο αναγνωριστικό ομάδας του νέου εκτελέσιμου αρχείου. Το πραγματικό αναγνωριστικό χρήστη και το πραγματικό αναγνωριστικό ομάδας της νέας διαδικασίας κληρονομούνται από τη διαδικασία κλήσης.

Τα συνδεδεμένα τμήματα κοινόχρηστης μνήμης δεν κληρονομούνται από τη νέα διαδικασία [βλ shmop(2) ].

Η νέα διαδικασία έχει απενεργοποιήσει το προφίλ.

Επιπλέον, η νέα διαδικασία κληρονομεί τα ακόλουθα χαρακτηριστικά από τη διαδικασία που ονομάζεται exec:

  1. Τιμή προσαρμογής προτεραιότητας [βλ ωραίο (2) ].
  2. Αναγνωριστικό διαδικασίας.
  3. Αναγνωριστικό της γονικής διαδικασίας.
  4. Αναγνωριστικό ομάδας διεργασιών.
  5. semadj έννοιες [βλ semop (2) ].
  6. Αναγνωριστικό ομάδας τερματικού [βλ έξοδος (2) ].
  7. Trace mode [βλ ptrace (2) ].
  8. Χρόνος που απομένει μέχρι να χτυπήσει το ξυπνητήρι [βλ συναγερμός (2) ].
  9. Τρέχων κατάλογος εργασίας.
  10. Κατάλογος ρίζας.
  11. Μάσκα τρόπου δημιουργίας αρχείου [βλ. umask (2) ].
  12. Όριο μεγέθους αρχείου [βλ ulimit(2) ].
  13. Μετρητές χρόνου που δαπανάται για την εξυπηρέτηση αυτής της διαδικασίας (tms_utime, tms_stime, tms_cutime, tms_cstime) [βλ. φορές (2) ].
  14. Αποκλεισμός πρόσβασης σε τμήματα αρχείων [βλ. fcntl(2)Και lockf (3C) ].

Η κλήση συστήματος exec αποτυγχάνει και το στοιχείο ελέγχου επιστρέφει εάν ισχύει τουλάχιστον μία από τις ακόλουθες συνθήκες: Το στοιχείο διαδρομής του νέου εκτελέσιμου αρχείου δεν υπάρχει. Το στοιχείο διαδρομής του νέου εκτελέσιμου δεν είναι κατάλογος. Ένας από τους καταλόγους που παρατίθενται στη διαδρομή του νέου εκτελέσιμου αρχείου δεν είναι ορατός. Το νέο εκτελέσιμο αρχείο δεν είναι κανονικό αρχείο. Δεν υπάρχει άδεια για την εκτέλεση του νέου αρχείου. Το νέο αρχείο έχει δικαιώματα εκτέλεσης, αλλά η κεφαλίδα του δεν ξεκινά με έγκυρο μαγικό αριθμό [βλ α.έξω(4)]. Το νέο εκτελέσιμο αρχείο είναι προς το παρόν ανοιχτό για εγγραφή με κάποια διαδικασία. Η νέα διαδικασία απαιτεί περισσότερη μνήμη από αυτή που επιτρέπει το όριο MAXMEM του συστήματος. Το συνολικό μήκος της λίστας ορισμάτων υπερβαίνει το όριο συστήματος των 5120 byte. Λείπει ο απαιτούμενος εξοπλισμός. Μη έγκυρες διευθύνσεις ως ορίσματα. Ανεπαρκής μνήμη.



. Λέσχη υπολογιστών του Oleg Shein.

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: