Διαδιεργασιακή επικοινωνία: Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
JohnMad (συζήτηση | συνεισφορές)
μΧωρίς σύνοψη επεξεργασίας
μΧωρίς σύνοψη επεξεργασίας
Γραμμή 12:
 
=== Σωληνώσεις ===
Η παλαιότερη μέθοδος διαδιεργασιακής επικοινωνίας στο Unix είναι οι '''σωληνώσεις''' (pipes). Πρόκειται για δομές δεδομένων του πυρήνα που επιτρέπουν σε δύο συγγενείς διεργασίες να ανταλλάσουνανταλλάσσουν αμφίδρομα δεδομένα. Εμφανίζονται στον χώρο του χρήστη ως ζεύγη περιγραφέων [[αρχείο υπολογιστή|αρχείων]], χωρίς να αντιστοιχούν σε πραγματικά αρχεία, όπου ο ένας περιγραφέας είναι άκρο εγγραφής και ο άλλος άκρο ανάγνωσης. Οι συνήθεις κλήσεις συστήματος για Είσοδο / Έξοδο σε αρχεία (<code>read()</code>, <code>write()</code>, <code>close()</code>) βρίσκουν εφαρμογή και εδώ. Σε κάθε σωλήνωση μπορούν να αντιστοιχούν πολλαπλά ζεύγη περιγραφέων σε διαφορετικές διεργασίες, υλοποιώντας έτσι τη διαδιεργασιακή επικοινωνία. Αυτή η πολλαπλότητα γίνεται εφικτή μέσω της κατασκευής νέων διεργασιών (μοντέλο <code>fork()</code>, όπου η θυγατρική κληρονομεί όλους τους ανοικτούς περιγραφείς της γονικής διεργασίας). Είναι ευθύνη του προγραμματιστή να κλείσει τα άκρα ανάγνωσης ή εγγραφής στις αντίστοιχες διεργασίες ώστε να επιτύχει την επιθυμητή συμπεριφορά (π.χ. μία διεργασία να γράφει και η γονική της να διαβάζει τη σωλήνωση). Το μειονέκτημα είναι ότι με σωληνώσεις μόνο συγγενείς διεργασίες μπορούν να επικοινωνήσουν (γονική με θυγατρική ή αδελφές διεργασίες μεταξύ τους). Μία σωλήνωση δημιουργείται με την κλήση συστήματος '''<code>pipe()</code>'''. Η ανάγνωση από σωλήνωση με όλα τα άκρα εγγραφής κλειστά, είτε διαβάζει όλα τα δεδομένα που τοποθετήθηκαν στη σωλήνωση προτού κλείσει κάποιο άκρο εγγραφής και δεν αναγνώστηκαν ακόμη, είτε (αν δεν ισχύει αυτή η περίπτωση) η <code>read()</code> επιστρέφει αμέσως 0. Η εγγραφή σε σωληνώσεις με όλα τα άκρα ανάγνωσης κλειστά οδηγεί στην αποστολή του σήματος SIGPIPE από τον πυρήνα στην καλούσα διεργασία και στην αποτυχία της κλήσης <code>write()</code>. Σε σχέση με τις σωληνώσεις ενδιαφέρον παρουσιάζει η κλήση συστήματος '''<code>dup()</code>''', η οποία δέχεται ως όρισμα έναν περιγραφέα αρχείου και τον κλωνοποιεί αναθέτωνταςαναθέτοντας στο αντίγραφο τον πρώτο ελεύθερο αναγνωριστικό αριθμό (έτσι π.χ. μπορεί να αντικατασταθεί με κάποια σωλήνωση η τυπική είσοδος ή η τυπική έξοδος μίας διεργασίας).
 
Ακολουθεί ένα παράδειγμα χειρισμού σωληνώσεων σε [[γλώσσα προγραμματισμού C]]: