Επικοινωνία μεταξύ διεργασιών - ένας οδηγός εκμάθησης#

Δύο προγράμματα που χρειάζεται να επικοινωνήσουν έχουν μια χούφτα κανάλια να επιλέξουν: έναν σωλήνα, ένα ονομασμένο FIFO στον δίσκο, μια υποδοχή πάνω από το δίκτυο, ένα ζεύγος υποδοχών στη μνήμη ή ένα κομμάτι κοινόχρηστης μνήμης System V. Αυτός ο οδηγός εκμάθησης είναι ένα βιβλίο συνταγών. Κάθε σελίδα σας δίνει ένα πλήρες, εκτελέσιμο πρόγραμμα - έναν παραγωγό και έναν καταναλωτή, ή έναν πελάτη και έναν διακομιστή - που μπορείτε να αντιγράψετε, να εκτελέσετε και να προσαρμόσετε.

Οι μηχανισμοί κάθε καναλιού - τι επιστρέφει η socket, πώς η fork διασπά μια διεργασία, τι κάνει το %SIG - τεκμηριώνονται ήδη στην αναφορά ανά ενσωματωμένη συνάρτηση και στο κεφάλαιο των σημάτων. Αυτός ο οδηγός εκμάθησης δεν τα επαναλαμβάνει. Τα συναρμολογεί σε λειτουργικά προγράμματα IPC και συνδέει κάθε κλήση πίσω στη σελίδα αναφοράς της.

Η PetaPerl τρέχει μόνο σε Linux, οπότε όλα εδώ είναι POSIX. Δεν υπάρχει IPC Win32, ούτε εναλλακτική ονομασμένου σωλήνα σε Windows, ούτε Win32::Process. Οι συνταγές χρησιμοποιούν τις κλήσεις συστήματος που πραγματικά παρέχει ένας πυρήνας Linux.

Επιλογή καναλιού#

Επιλέξτε το ελαφρύτερο κανάλι που μεταφέρει αυτό που χρειάζεστε:

  • Ένα παιδί που εκτελεί μια εντολή - θέλετε την έξοδο της sort ή την είσοδο του gzip. Χρησιμοποιήστε ένα άνοιγμα σωλήνα, ή τα IPC::Open2 / IPC::Open3 όταν χρειάζεστε και τις δύο κατευθύνσεις. Δείτε Υποδιεργασίες και συνεργαζόμενες διεργασίες.

  • Δύο σχετιζόμενες διεργασίες, ένα μηχάνημα - ένας γονέας και ένα παιδί που μόλις δημιούργησε με fork, που μοιράζονται μια ροή bytes. Χρησιμοποιήστε pipe ή socketpair. Δείτε Υποδιεργασίες και Υποδοχές UNIX-domain και UDP.

  • Μη σχετιζόμενες διεργασίες, ένα μηχάνημα - δύο προγράμματα που ξεκίνησαν ανεξάρτητα και συναντιούνται σε μια γνωστή διαδρομή. Χρησιμοποιήστε ένα FIFO ή μια υποδοχή UNIX-domain. Δείτε FIFO και Υποδοχές UNIX-domain και UDP.

  • Διεργασίες σε διαφορετικά μηχανήματα - ένας πελάτης και ένας διακομιστής δικτύου. Χρησιμοποιήστε μια υποδοχή TCP. Δείτε Υποδοχές TCP.

  • Ένα datagram, ρίξε-και-ξέχνα - καμία σύνδεση, διατήρηση των ορίων μηνύματος. Χρησιμοποιήστε μια υποδοχή UDP. Δείτε Υποδοχές UNIX-domain και UDP.

  • Ένας κοινόχρηστος μετρητής ή ενταμιευτής χωρίς αντιγραφή - σηματοφόροι και κοινόχρηστη μνήμη System V. Χρησιμοποιήστε semget και shmget. Δείτε IPC System V.

Πώς είναι οργανωμένος αυτός ο οδηγός εκμάθησης#

Κάθε σελίδα στέκεται από μόνη της. Διαβάστε εκείνη που απαντά στην ερώτησή σας.

  • Υποδιεργασίες και συνεργαζόμενες διεργασίες - εκτέλεση μιας εντολής και επικοινωνία μαζί της, σε μία ή και στις δύο κατευθύνσεις, με το άνοιγμα σωλήνα και με τα IPC::Open2 / IPC::Open3.

  • FIFO - ένας ονομασμένος σωλήνας στο σύστημα αρχείων που επιτρέπει σε δύο μη σχετιζόμενα προγράμματα να συναντηθούν σε μια διαδρομή.

  • Υποδοχές TCP - ένας πλήρης πελάτης και ένας διακομιστής echo που κάνει fork, πάνω από τη διεπαφή loopback.

  • Υποδοχές UNIX-domain και UDP - τοπικές υποδοχές ροής μέσω της socketpair, και datagrams UDP χωρίς σύνδεση.

  • IPC System V - σηματοφόροι και κοινόχρηστη μνήμη με τις χαμηλού επιπέδου ενσωματωμένες συναρτήσεις semget / shmget.

Τι δεν καλύπτει αυτός ο οδηγός εκμάθησης#

  • Τα σήματα ως μηχανισμός συντονισμού πέρα από τα βασικά. Η αποστολή ενός σήματος με kill και η σύλληψή του μέσω του %SIG καλύπτεται εκεί όπου τη χρειάζεται κάθε συνταγή· ο πλήρης πίνακας διάθεσης σημάτων βρίσκεται στην αναφορά %SIG.

  • Παραλληλισμός εντός διεργασίας. Η εκτέλεση εργασίας σε πολλούς πυρήνες CPU μέσα σε ένα μόνο πρόγραμμα είναι αυτόματη παραλληλοποίηση, ένα διαφορετικό θέμα. Δείτε τον οδηγό Ταυτόχρονη εκτέλεση.

  • Αρθρώματα δικτύωσης υψηλού επιπέδου. Αυτός ο οδηγός εκμάθησης παραμένει στο επίπεδο της ενσωματωμένης socket ώστε οι μηχανισμοί να είναι ορατοί. Οι συνταγές είναι το θεμέλιο πάνω στο οποίο θα χτιζόταν ένα περιτύλιγμα υψηλότερου επιπέδου.