τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το σήμα (σήμα) είναι μια διακοπή λογισμικού Είναι μια μέθοδος μετάδοσης μηνυμάτων μεταξύ διεργασιών.
Υπάρχουν πολλοί λόγοι για τους οποίους δημιουργούνται σήματα στο Shellkill
καιkillall
Εντολή για αποστολή σήματος:
kill -信号的类型 进程编号
killall -信号的类型 进程名
όνομα σήματος | τιμή σήματος | Προεπιλεγμένη ενέργεια επεξεργασίας | Λόγος σηματοδότησης |
---|---|---|---|
ΣΙΓΧΟΥΠ | 1 | ΕΝΑ | Το τερματικό κολλάει ή η διαδικασία ελέγχου τερματίζεται |
SIGINT | 2 | ΕΝΑ | Διακοπή πληκτρολογίου Ctrl+c |
SIGQUIT | 3 | ντο | Το πλήκτρο διαφυγής του πληκτρολογίου πατιέται |
ΣΙΓΙΛ | 4 | ντο | Παράνομη οδηγία |
SIGTRAP | 5 | ντο | οδηγίες για το σημείο διακοπής |
SIGABRT | 6 | ντο | Σήμα ματαίωσης που εκδόθηκε από abort(3) |
SIGBUS | 7 | ντο | σφάλμα λεωφορείου |
ΣΙΓΦΠΕ | 8 | ντο | εξαίρεση κινητής υποδιαστολής |
ΣΙΓΚΙΛ | 9 | ΕΝΑ | Το kill -9 σκοτώνει τη διαδικασία, αυτό το σήμα δεν μπορεί να ληφθεί και να αγνοηθεί |
SIGUSR1 | 10 | ΕΝΑ | Σήμα καθορισμένο από το χρήστη 1 |
SIGSEGV | 11 | ντο | Μη έγκυρη αναφορά μνήμης (πίνακας εκτός ορίων, λειτουργία μηδενικού δείκτη) |
SIGUSR2 | 12 | ΕΝΑ | Σήμα καθορισμένο από το χρήστη 2 |
SIGPIPE | 13 | ΕΝΑ | Εγγραφή δεδομένων σε σωλήνα χωρίς διαδικασία ανάγνωσης |
SIGALRM | 14 | ΕΝΑ | Σήμα ξυπνητηριού, σήμα που αποστέλλεται από τη λειτουργία alarm(). |
SIGTERM | 15 | ΕΝΑ | Σήμα τερματισμού, το σήμα που αποστέλλεται από προεπιλογή |
SIGSTKFLT | 16 | ΕΝΑ | σφάλμα στοίβας |
SIGCHLD | 17 | σι | Εκπέμπεται όταν τελειώνει η θυγατρική διαδικασία |
SIGCONT | 18 | ρε | Συνέχιση μιας διακοπείσας διαδικασίας |
SIGSTOP | 19 | ρε | Διακοπή διαδικασίας |
SIGTSTP | 20 | ρε | Το τερματικό πατήστε το πλήκτρο διακοπής |
SIGTTIN | 21 | ρε | Η διαδικασία παρασκηνίου ζητά την ανάγνωση του τερματικού |
ΣΙΓΤΤΟΥ | 22 | ρε | Η διαδικασία παρασκηνίου ζητά εγγραφή στο τερματικό |
SIGURG | 23 | σι | Ανίχνευση κατάστασης έκτακτης ανάγκης (πρίζες) |
SIGXCPU | 24 | ντο | Υπέρβαση του χρονικού ορίου CPU |
SIGXFSZ | 25 | ντο | Υπέρβαση του ορίου μεγέθους αρχείου |
SIGVTALRM | 26 | ΕΝΑ | εικονικό σήμα ρολογιού |
ΣΙΓΠΡΟΦ | 27 | ΕΝΑ | Αναλύστε τα σήματα ρολογιού |
SIGWINCH | 28 | σι | Το μέγεθος του παραθύρου αλλάζει |
SIGPOLL | 29 | σι | Δημοσκόπηση (Sys V) |
SIGPWR | 30 | ΕΝΑ | διακοπή ρεύματος |
ΣΙΓΣΥΣ | 31 | ντο | Παράνομη κλήση συστήματος |
Η προεπιλεγμένη ενέργεια του Α είναι να τερματίσει τη διαδικασία.
Η προεπιλεγμένη ενέργεια του B είναι να αγνοήσει αυτό το σήμα.
Η προεπιλεγμένη ενέργεια του C είναι να τερματίσει τη διαδικασία και να κάνει μια ένδειξη απόθεσης εικόνας πυρήνα.
Η προεπιλεγμένη ενέργεια του D είναι να σταματήσει τη διαδικασία και το πρόγραμμα που εισέρχεται στην κατάσταση διακοπής μπορεί να συνεχίσει να εκτελείται.
Υπάρχουν τρεις τρόποι για να χειριστούν οι διεργασίες τα σήματα:
signal()
Οι συναρτήσεις μπορούν να ρυθμίσουν τον τρόπο με τον οποίο το πρόγραμμα χειρίζεται τα σήματα.
Δήλωση λειτουργίας:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
Περιγραφή παραμέτρου:
sig
: Καθορίστε το σήμα προς λήψη.func
: Λειτουργία επεξεργασίας σήματος δείκτης. Η συνάρτηση επεξεργασίας πρέπει να λάβει μια ακέραια παράμετρο, η οποία είναι ο αριθμός σήματος που έχει ληφθεί.SIG_DFL
Η μακροεντολή :SIG_DFL αντιπροσωπεύει την προεπιλεγμένη μέθοδο επεξεργασίας σήματος.χρήσηSIG_DFL
όπως καιsignal
Η δεύτερη παράμετρος της συνάρτησης υποδεικνύει ότι χρησιμοποιείται η προεπιλεγμένη μέθοδος επεξεργασίας του συστήματος για το σήμα.SIG_IGN
Η μακροεντολή :SIG_IGN σημαίνει να αγνοήσετε το σήμα.χρήσηSIG_IGN
όπως καιsignal
Η δεύτερη παράμετρος της συνάρτησης υποδεικνύει ότι όταν η διεργασία λάβει το σήμα, θα το αγνοήσει και δεν θα εκτελέσει καμία επεξεργασία. Αυτό μπορεί να αποτρέψει τον απροσδόκητο τερματισμό ή τη διακοπή των διαδικασιών σε ορισμένες περιπτώσεις.SIG_ERR
:SIG_ERR
Οι μακροεντολές χρησιμοποιούνται για την ένδειξη σφαλμάτων.δεν είναι όπωςsignal
Η δεύτερη παράμετρος της συνάρτησης χρησιμοποιείται αντί ωςsignal
Η τιμή επιστροφής της συνάρτησης υποδεικνύει ότι η κλήση απέτυχε.ανsignal
Εάν η κλήση προς τη συνάρτηση αποτύχει, θα επιστρέψειSIG_ERR
.Αυτό χρησιμοποιείται συνήθως για την ανίχνευση και την επεξεργασίαsignal
Σφάλμα στην κλήση συνάρτησης.Το πρόγραμμα σέρβις εκτελείται στο παρασκήνιο, αν θέλετε να το σταματήσετε, δεν είναι καλή ιδέα να το σκοτώσετε, γιατί όταν η διαδικασία σκοτώνεται, πεθαίνει ξαφνικά και δεν κανονίζεται μεταγενέστερη εργασία.
Εάν στείλετε ένα σήμα στο πρόγραμμα σέρβις, μετά τη λήψη του σήματος, το πρόγραμμα σέρβις καλεί μια συνάρτηση και γράφει τον μεταγενέστερο κωδικό στη συνάρτηση και το πρόγραμμα μπορεί να εξέλθει με προγραμματισμένο τρόπο.
Η αποστολή σήματος 0 στο πρόγραμμα σέρβις μπορεί να ανιχνεύσει εάν το πρόγραμμα είναι ζωντανό.
Το λειτουργικό σύστημα Linux παρέχει kill
καιkillall
Η εντολή στέλνει ένα σήμα στο πρόγραμμα Στο πρόγραμμα, μπορείτε να χρησιμοποιήσετεkill()
Οι λειτουργίες της βιβλιοθήκης στέλνουν σήματα σε άλλες διεργασίες.
Δήλωση λειτουργίας:
int kill(pid_t pid, int sig);
kill()
Η συνάρτηση παίρνει τις παραμέτρουςsig
Το καθορισμένο σήμα μεταβιβάζεται στην παράμετροpid
καθορισμένη διαδικασία.
παράμετρος pid
Υπάρχουν διάφορες καταστάσεις:
pid > 0
Περάστε το σήμα στη διαδικασία ωςpid
επεξεργάζομαι, διαδικασία.pid = 0
Περάστε το σήμα σε όλες τις διεργασίες στην ίδια ομάδα διεργασιών με την τρέχουσα διεργασία Χρησιμοποιείται συχνά από τη γονική διεργασία για την αποστολή σημάτων στη θυγατρική διαδικασία.pid < -1
Περάστε το σήμα στο αναγνωριστικό της ομάδας διεργασιών του|pid|
όλων των διαδικασιών.pid = -1
Διαβιβάζει το σήμα σε όλες τις διεργασίες που έχουν άδεια αποστολής του σήματος, αλλά όχι στη διεργασία που έστειλε το σήμα.Υπάρχουν 8 τρόποι για να τερματίσετε μια διαδικασία, 5 από τους οποίους είναι κανονικοί τερματισμοί, αυτοί είναι:
main()
Για λειτουργίεςreturn
ΕΠΙΣΤΡΟΦΗ;exit()
λειτουργία;_exit()
ή_Exit()
λειτουργία;return
ΕΠΙΣΤΡΟΦΗ;pthread_exit()
ΕΠΙΣΤΡΟΦΗ;Υπάρχουν τρεις τρόποι για να τερματίσετε ασυνήθιστα, είναι:
abort()
λειτουργία ακύρωση?υπάρχει main()
Στη συνάρτηση,return
Η επιστρεφόμενη τιμή είναι η κατάσταση τερματισμού, εάν όχιreturn
δήλωση ή κλήσηexit()
, τότε η κατάσταση τερματισμού της διαδικασίας είναι 0.
Στο κέλυφος, προβάλετε την κατάσταση τερματισμού της διαδικασίας:
echo $?
3 λειτουργίες για τον κανονικό τερματισμό της διαδικασίας (exit()
και_Exit()
καθορίζεται από το ISO C,_exit()
καθορίζεται από το POSIX):
void exit(int status);
void _exit(int status);
void _Exit(int status);
status
Η κατάσταση τερματισμού της διαδικασίας.
return
Υποδεικνύει ότι όταν επιστρέψει η συνάρτηση, θα κληθεί ο καταστροφέας του τοπικού αντικειμένου.main()
σε λειτουργίαreturn
Ο καταστροφέας του παγκόσμιου αντικειμένου ονομάζεται επίσης.exit()
Υποδεικνύει για τον τερματισμό της διαδικασίας, δεν θα κληθεί ο καταστροφέας του τοπικού αντικειμένου, θα κληθεί μόνο ο καταστροφέας του καθολικού αντικειμένου._exit()
και_Exit()
Βγείτε απευθείας και δεν θα πραγματοποιηθούν εργασίες καθαρισμού.Η διαδικασία είναι διαθέσιμη atexit()
Η εγγραφή συνάρτησης τερματίζει λειτουργίες (έως 32), αυτές οι λειτουργίες θα είναιexit()
Αυτόματη κλήση.
int atexit(void (*function)(void));
exit()
Η σειρά με την οποία καλούνται οι συναρτήσεις τερματισμού αντιστρέφεται από τη στιγμή της εγγραφής.
system()
Η συνάρτηση παρέχει μια απλή μέθοδο εκτέλεσης του προγράμματος, περνώντας το πρόγραμμα και τις παραμέτρους που πρέπει να εκτελεστούν ως συμβολοσειρά.system()
Απλά λειτουργία.
Δήλωση λειτουργίας:
int system(const char * string);
system()
Η τιμή επιστροφής της συνάρτησης είναι πιο ενοχλητική.
system()
Η συνάρτηση επιστρέφει μη μηδενική.system()
Η συνάρτηση επιστρέφει 0.system()
Η συνάρτηση επιστρέφει μη μηδενική.exec
Οι οικογένειες συναρτήσεων παρέχουν έναν άλλο τρόπο κλήσης προγραμμάτων (δυαδικά ή σενάρια φλοιού) μέσα σε μια διαδικασία.
exec
Η οικογένεια συναρτήσεων δηλώνεται ως εξής:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
Ειδοποίηση:
errno
Μέσης.exec
Μετά από αυτό, το καλούμενο πρόγραμμα θα αντικαταστήσει το πρόγραμμα κλήσης, δηλαδήexec
Δεν θα εκτελεστεί κανένας κωδικός μετά τη λειτουργία.execl()
καιexecv()
, άλλα χρησιμοποιούνται σπάνια.Όλες οι διεργασίες σε ολόκληρο το σύστημα Linux είναι σε δομή δέντρου.
χρήσηpstree
Μπορείτε να δείτε το δέντρο διεργασιών με την εντολή:
pstree -p 进程编号
Κάθε διεργασία έχει ένα μοναδικό αναγνωριστικό διεργασίας που αντιπροσωπεύεται από έναν μη αρνητικό ακέραιο. Αν και μοναδικά, τα αναγνωριστικά διεργασίας μπορούν να επαναχρησιμοποιηθούν. Όταν μια διεργασία τερματίζεται, το αναγνωριστικό διεργασίας της γίνεται υποψήφιο για επαναχρησιμοποίηση. Το Linux χρησιμοποιεί έναν αλγόριθμο καθυστερημένης επαναχρησιμοποίησης, έτσι ώστε το αναγνωριστικό μιας διαδικασίας που δημιουργήθηκε πρόσφατα να διαφέρει από το αναγνωριστικό που χρησιμοποιήθηκε από την πρόσφατα τερματισμένη διαδικασία. Αυτό αποτρέπει το να μπερδευτούν οι νέες διεργασίες ως τερματισμένες διεργασίες που χρησιμοποιούν το ίδιο αναγνωριστικό.
Λειτουργία για λήψη αναγνωριστικού διαδικασίας:
pid_t getpid(void); // 获取当前进程的ID。
pid_t getppid(void); // 获取父进程的ID。
Μια υπάρχουσα διαδικασία μπορεί να καλέσειfork()
Η συνάρτηση δημιουργεί μια νέα διαδικασία.
Δήλωση λειτουργίας:
pid_t fork(void);
Εξαρτάται απόfork()
Η νέα διαδικασία που δημιουργείται ονομάζεται θυγατρική διαδικασία.
fork()
Η συνάρτηση καλείται μία φορά αλλά επιστρέφει δύο φορές. Η διαφορά μεταξύ των δύο επιστροφών είναι ότι η τιμή επιστροφής της θυγατρικής διεργασίας είναι 0, ενώ η τιμή επιστροφής της γονικής διαδικασίας είναι το αναγνωριστικό διεργασίας της νεοδημιουργηθείσας θυγατρικής διεργασίας.
Η θυγατρική διαδικασία και η γονική διαδικασία συνεχίζουν να εκτελούνταιfork()
Ο κωδικός μετά από αυτό, Η θυγατρική διαδικασία είναι αντίγραφο της γονικής διαδικασίας. Η θυγατρική διαδικασία έχει ένα αντίγραφο του χώρου δεδομένων της γονικής διεργασίας, του σωρού και της στοίβας (σημείωση: η θυγατρική διεργασία έχει ένα αντίγραφο, δεν είναι κοινόχρηστο με τη γονική διαδικασία).
fork()
Μετά από αυτό, η σειρά εκτέλεσης των γονικών και θυγατρικών διεργασιών δεν είναι καθορισμένη.
fork()
, αφήστε τη θυγατρική διαδικασία να χειριστεί αυτά τα αιτήματα, ενώ η γονική διαδικασία συνεχίζει να περιμένει για το επόμενο αίτημα σύνδεσης.fork()
Κάλεσαν αμέσως μετά την επιστροφήexec
。fork()
Ένα χαρακτηριστικό είναι ότι οι περιγραφείς αρχείων που ανοίγουν στη γονική διαδικασία θα αντιγραφούν στη θυγατρική διαδικασία και η γονική διαδικασία και η θυγατρική διαδικασία μοιράζονται την ίδια μετατόπιση αρχείου.
Εάν μια γονική διεργασία και μια θυγατρική διεργασία γράψουν σε ένα αρχείο που υποδεικνύεται από τον ίδιο περιγραφέα χωρίς καμία μορφή συγχρονισμού, η έξοδος τους μπορεί να αναμιχθεί μεταξύ τους.
Σε αυτό το σημείο μπορείτε να δείτε ότι υπάρχουν μόνο 100.000 σειρές δεδομένων.
Αυτή τη στιγμή, θα πρέπει να υπάρχουν 200.000 σειρές δεδομένων, επειδή η λειτουργία εγγραφής αρχείου δεν είναι ατομική, δύο διεργασίες μπορεί να προσπαθήσουν να γράψουν διαφορετικά μέρη του αρχείου προκαλώντας την αποτυχία της εγγραφής Τα δεδομένα παρεμβάλλονται μεταξύ τους.
vfork()
Οι κλήσεις συναρτήσεων και οι τιμές επιστροφής είναι ίδιες μεfork()
Το ίδιο, αλλά η σημασιολογία τους είναι διαφορετική.
vfork()
Η συνάρτηση χρησιμοποιείται για τη δημιουργία μιας νέας διεργασίας σκοπός της οποίας είναιexec
Ένα νέο πρόγραμμα που δεν αντιγράφει το χώρο διευθύνσεων της γονικής διαδικασίας επειδή καλεί αμέσως η θυγατρική διαδικασίαexec
, επομένως ο χώρος διευθύνσεων της γονικής διαδικασίας δεν θα χρησιμοποιηθεί. Εάν η θυγατρική διαδικασία χρησιμοποιεί τον χώρο διευθύνσεων της γονικής διαδικασίας, ενδέχεται να προκύψουν άγνωστα αποτελέσματα.
vfork()
καιfork()
Μια άλλη διαφορά είναι:vfork()
Βεβαιωθείτε ότι η θυγατρική διεργασία εκτελείται πρώτα και καλέστε την στη θυγατρική διεργασίαexec
ήexit
Στη συνέχεια, η γονική διαδικασία συνεχίζει να λειτουργεί.
Στο λειτουργικό σύστημα, μια διεργασία ζόμπι αναφέρεται σε μια θυγατρική διαδικασία που έχει τερματιστεί αλλά η γονική της διαδικασία δεν έχει ακόμη διαβάσει την κατάσταση εξόδου της. Παρόλο που η διαδικασία ζόμπι δεν εκτελείται πλέον, εξακολουθεί να καταλαμβάνει μια καταχώρηση στον πίνακα διεργασιών, έτσι ώστε ο πυρήνας να μπορεί να αποθηκεύσει τις πληροφορίες κατάστασης εξόδου της διεργασίας (όπως αναγνωριστικό διεργασίας, κατάσταση εξόδου κ.λπ.) έως ότου η γονική διαδικασία διαβάσει αυτές τις πληροφορίες.
Εάν η γονική διαδικασία τερματιστεί πριν από τη θυγατρική, η θυγατρική διαδικασία θα φιλοξενηθεί από τη διαδικασία 1 (αυτός είναι επίσης ένας τρόπος για να αφήσετε τη διαδικασία να εκτελεστεί στο παρασκήνιο).
Εάν η θυγατρική διαδικασία τερματιστεί πριν από τη γονική διαδικασία και η γονική διαδικασία δεν επεξεργάζεται τις πληροφορίες εξόδου της θυγατρικής διαδικασίας, τότε η θυγατρική διαδικασία θα γίνει διαδικασία ζόμπι.
Ο πυρήνας διατηρεί μια δομή δεδομένων για κάθε θυγατρική διεργασία, συμπεριλαμβανομένου του αριθμού διεργασίας, της κατάστασης τερματισμού, του χρόνου CPU που χρησιμοποιείται κ.λπ. Εάν η γονική διαδικασία επεξεργάζεται τις πληροφορίες εξόδου της θυγατρικής διεργασίας, ο πυρήνας θα απελευθερώσει αυτήν τη δομή δεδομένων. Εάν η γονική διαδικασία δεν επεξεργάζεται τις πληροφορίες εξόδου της θυγατρικής διεργασίας, ο πυρήνας δεν θα απελευθερώσει αυτήν τη δομή δεδομένων και ο αριθμός διεργασίας της θυγατρικής διαδικασίας θα είναι πάντα κατειλημμένος. Οι διαθέσιμοι αριθμοί διεργασιών στο σύστημα είναι περιορισμένοι.
signal(SIGCHLD, SIG_IGN)
Ειδοποιήστε τον πυρήνα ότι δεν ενδιαφέρεται για την έξοδο από τη θυγατρική διαδικασία και η δομή δεδομένων του θα κυκλοφορήσει αμέσως μετά την έξοδο της θυγατρικής διαδικασίας.wait()
/waitpid()
λειτουργία: Η γονική διαδικασία περιμένει να τελειώσει η θυγατρική διαδικασία καλώντας αυτές τις συναρτήσεις και αποκτά την κατάσταση εξόδου της, απελευθερώνοντας έτσι τους πόρους που καταλαμβάνει η θυγατρική διαδικασία.pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid, int *stat_loc, int options);
pid_t wait3(int *status, int options, struct rusage *rusage);
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
Η τιμή επιστροφής είναι ο αριθμός της θυγατρικής διαδικασίας.
stat_loc
Είναι οι πληροφορίες σχετικά με τον τερματισμό της διαδικασίας παιδιού:
α) Εάν τερματιστεί κανονικά, η μακροεντολή WIFEXITED(stat_loc)
Επιστροφή αλήθεια, μακροεντολήWEXITSTATUS(stat_loc)
Η κατάσταση τερματισμού μπορεί να ληφθεί.
β) Εάν τερματίζει ασυνήθιστα, η μακροεντολή WTERMSIG(stat_loc)
Λαμβάνει το σήμα για τον τερματισμό της διαδικασίας.
Εάν η γονική διαδικασία είναι απασχολημένη, μπορείτε να κάνετε λήψη SIGCHLD
Σήμα, καλούμενο στη λειτουργία επεξεργασίας σήματοςwait()
/waitpid()
。
[Αποστολή σημάτων μεταξύ διεργασιών](##1.5 Αποστολή σημάτων)
Σε ένα πρόγραμμα υπηρεσίας πολλαπλών διεργασιών, εάν η υποδιεργασία λάβει ένα σήμα εξόδου, η υποδιεργασία θα εξέλθει από μόνη της.
Εάν η γονική διεργασία λάβει ένα σήμα εξόδου, θα πρέπει να στείλει σήματα εξόδου σε όλες τις θυγατρικές διεργασίες και στη συνέχεια να εξέλθει από μόνη της.
Τα πολλαπλά νήματα μοιράζονται τον χώρο διευθύνσεων μιας διεργασίας,Εάν πολλά νήματα χρειάζονται πρόσβαση στην ίδια μνήμη, απλώς χρησιμοποιήστε καθολικές μεταβλητές.。
Σε πολλαπλές διεργασίες, ο χώρος διευθύνσεων κάθε διεργασίας είναι ανεξάρτητος και δεν είναι κοινόχρηστος.Εάν πολλές διεργασίες χρειάζονται πρόσβαση στην ίδια μνήμη, δεν μπορούν να χρησιμοποιηθούν καθολικές μεταβλητές, μπορεί να χρησιμοποιηθεί μόνο κοινόχρηστη μνήμη.。
Η Κοινόχρηστη Μνήμη επιτρέπει σε πολλαπλές διεργασίες (δεν απαιτείται σχέση αίματος μεταξύ των διεργασιών) να έχουν πρόσβαση στον ίδιο χώρο μνήμης Είναι ο πιο αποτελεσματικός τρόπος κοινής χρήσης και μεταφοράς δεδομένων μεταξύ πολλαπλών διεργασιών. Οι διεργασίες μπορούν να συνδέσουν την κοινόχρηστη μνήμη με τον δικό τους χώρο διευθύνσεων Εάν μια διεργασία τροποποιήσει τα δεδομένα στην κοινόχρηστη μνήμη, τα δεδομένα που διαβάζονται από άλλες διεργασίες θα αλλάξουν επίσης.
Η κοινόχρηστη μνήμη δεν παρέχει μηχανισμό κλειδώματος, δηλαδή όταν μια διεργασία διαβάζει/εγγράφει κοινόχρηστη μνήμη, δεν εμποδίζει άλλες διεργασίες να την διαβάσουν/εγγράψουν.Εάν θέλετε να κλειδώσετε την ανάγνωση/εγγραφή της κοινόχρηστης μνήμης, μπορείτε να χρησιμοποιήσετε έναν σηματοφόρο . Το Linux παρέχει ένα σύνολο λειτουργιών για τη λειτουργία κοινής μνήμης.
Αυτή η λειτουργία χρησιμοποιείται για τη δημιουργία/απόκτηση κοινόχρηστης μνήμης.
int shmget(key_t key, size_t size, int shmflg);
typedef unsigned int key_t
), γενικά σε δεκαεξαδικό, για παράδειγμα 0x5005
, τα κλειδιά διαφορετικών κοινών αναμνήσεων δεν μπορούν να είναι ίδια.0666|IPC_CREAT
Υποδεικνύει ότι εάν η κοινόχρηστη μνήμη δεν υπάρχει, δημιουργήστε την.χρήση ipcs -m
Μπορείτε να δείτε την κοινόχρηστη μνήμη του συστήματος, όπως: κλειδί, αναγνωριστικό κοινόχρηστης μνήμης (shmid), κάτοχος, δικαιώματα (perms) και μέγεθος (byte).
χρήση ipcrm -m 共享内存id
Η κοινόχρηστη μνήμη μπορεί να διαγραφεί με μη αυτόματο τρόπο ως εξής:
Σημείωση: Τα κοντέινερ δεν μπορούν να χρησιμοποιηθούν για τύπους δεδομένων στην κοινόχρηστη μνήμη, μπορούν να χρησιμοποιηθούν μόνο βασικοί τύποι δεδομένων.
Αυτή η λειτουργία χρησιμοποιείται για τη σύνδεση της κοινόχρηστης μνήμης στον χώρο διευθύνσεων της τρέχουσας διαδικασίας.
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmget()
Το αναγνωριστικό κοινόχρηστης μνήμης που επιστρέφεται από τη συνάρτηση.Επιστρέφει τη διεύθυνση έναρξης της κοινόχρηστης μνήμης όταν η κλήση είναι επιτυχής και επιστρέφει όταν αποτύχει. (void *)-1
。
Αυτή η λειτουργία χρησιμοποιείται για την αποσύνδεση της κοινόχρηστης μνήμης από την τρέχουσα διαδικασία, η οποία ισοδυναμεί με shmat()
Η αντίστροφη λειτουργία μιας συνάρτησης.
int shmdt(const void *shmaddr);
shmat()
Η διεύθυνση που επιστρέφεται από τη συνάρτηση.Επιστρέφει 0 εάν η κλήση επιτύχει και -1 εάν αποτύχει.
Αυτή η λειτουργία χρησιμοποιείται για τη λειτουργία κοινής μνήμης Η πιο συχνά χρησιμοποιούμενη λειτουργία είναι η διαγραφή της κοινόχρηστης μνήμης.
int shmctl(int shmid, int command, struct shmid_ds *buf);
shmget()
Το αναγνωριστικό κοινόχρηστης μνήμης που επιστρέφεται από τη συνάρτηση.IPC_RMID
。Επιστρέφει 0 εάν η κλήση επιτύχει και -1 εάν αποτύχει.
Σημείωση, χρήση root
Η δημιουργημένη κοινόχρηστη μνήμη δεν μπορεί να διαγραφεί από τους απλούς χρήστες ανεξάρτητα από τα δικαιώματα που έχουν δημιουργηθεί.
Επιστρέφει 0 εάν η κλήση επιτύχει και -1 εάν αποτύχει.
Αυτή η λειτουργία χρησιμοποιείται για τη λειτουργία κοινής μνήμης Η πιο συχνά χρησιμοποιούμενη λειτουργία είναι η διαγραφή της κοινόχρηστης μνήμης.
int shmctl(int shmid, int command, struct shmid_ds *buf);
shmget()
Το αναγνωριστικό κοινόχρηστης μνήμης που επιστρέφεται από τη συνάρτηση.IPC_RMID
。Επιστρέφει 0 εάν η κλήση επιτύχει και -1 εάν αποτύχει.
Σημείωση, χρήση root
Η δημιουργημένη κοινόχρηστη μνήμη δεν μπορεί να διαγραφεί από τους απλούς χρήστες ανεξάρτητα από τα δικαιώματα που έχουν δημιουργηθεί.
[Οι εικόνες εξωτερικού συνδέσμου μεταφέρονται...(img-v6qW3XRA-1720711279572)]
[Οι εικόνες εξωτερικού συνδέσμου μεταφέρονται...(img-CG0tGAne-1720711279572)]