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

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
μ Bot: Replace deprecated <source> tag and "enclose" parameter.
μ Ρομπότ: λατινικοί -> ελληνικοί χαρακτήρες, αντικατέστησε: Oι → Οι
 
Γραμμή 47:
</syntaxhighlight>
 
Εναλλακτικά μπορούν να χρησιμοποιηθούν '''κατονομασμένες σωληνώσεις''' (named pipes ή FIFOs). Αυτές κατά τη δημιουργία τους αντιστοιχίζονται σε οντότητες του συστήματος αρχείων, εικονικά αρχεία, ώστε να μπορούν να προσπελαστούν από μη συγγενείς διεργασίες που γνωρίζουν το μονοπάτι του εικονικού αρχείου. Ο χειρισμός τους γίνεται όπως των κοινών αρχείων, οπότε κάθε διεργασία για κάθε FIFO διατηρεί μόνο έναν περιγραφέα αρχείου ο οποίος επιστρέφεται από μία κοινή κλήση <code>open()</code>. Το μειονέκτημα είναι ότι ως αποτέλεσμα μία κατονομασμένη σωλήνωση λειτουργεί μονόδρομα, με κάθε διεργασία να μπορεί μόνο να γράφει σε αυτήν ή μόνο να διαβάζει από αυτήν, όπως συμβαίνει πάντα στο POSIX με τα αρχεία. Ένα FIFO δημιουργείται με την κλήση συστήματος '''<code>mkfifo()</code>''' και η διεργασία που το δημιούργησε πρέπει, αφού το κλείσει με την <code>close()</code>, να το διαγράψει από το σύστημα αρχείων με την κλήση συστήματος <code>unlink()</code>. Συνήθως πριν από την κλήση της <code>close()</code> η διεργασία αυτή διαβάζει δεδομένα από το FIFO, μέσω της κλήσης <code>read()</code>, τα οποία έχει γράψει εκεί κάποια άλλη διεργασία που γνώριζε το μονοπάτι του FIFO στο σύστημα αρχείων και το έχει ανοίξει για εγγραφή. Φυσιολογικά, κάθε κλήση <code>open()</code> για ανάγνωση μίας κατονομασμένης σωλήνωσης μπλοκάρει την καλούσα διεργασία μέχρι η σωλήνωση να ανοιχτεί από κάποια άλλη διεργασία για εγγραφή (και αντίστροφα). Αυτή η συμπεριφορά μπορεί να τροποποιηθεί με κατάλληλα ορίσματα (μη ανασταλτική <code>open()</code>) και σε αυτήν την περίπτωση το άνοιγμα για εγγραφή σε FIFO που δεν έχει ανοιχτεί για ανάγνωση αποτυγχάνει, ενώ το άνοιγμα για ανάγνωση σε FIFO που δεν έχει ανοιχτεί για εγγραφή επιστρέφει αμέσως. Οι αναγνώσεις από το FIFO διατηρούν το μέγεθος των αιτήσεων εγγραφής που προηγήθηκαν· αυτό σημαίνει πως αν μία διεργασία Α1 γράψει Ν byte, στη συνέχεια η ίδια γράψει Μ byte και τελικώς μία διεργασία Α2 διαβάσει το FIFO, η πρώτη αίτηση ανάγνωσης θα επιστρέψει τα αρχικά Ν byte και όχι τα ολικά Ν+Μ byte.
 
Πολλές διεργασίες μπορούν ταυτόχρονα να προσπελαύνουν το ίδιο αρχείο ή FIFO, πιθανώς για να ανταλλάξουν δεδομένα, με αποτέλεσμα να εμφανίζονται συνθήκες συναγωνισμού. Το πρόβλημα επιλύεται με τα '''κλειδώματα αρχείων''', δηλαδή εξειδικευμένα [[mutex]] που παρέχει ο πυρήνας για [[αμοιβαίος αποκλεισμός|αμοιβαίο αποκλεισμό]]. Τα κλειδώματα είναι είτε ''κοινόχρηστα'' είτε ''αποκλειστικά'' (με πολλαπλές διεργασίες να μπορούν να κατέχουν ταυτόχρονα ένα κοινόχρηστο κλείδωμα για το ίδιο αρχείο αλλά όχι ένα αποκλειστικό κλείδωμα, ή παράλληλα ένα κοινόχρηστο κι ένα αποκλειστικό κλείδωμα) και αφορούν ένα αρχείο και όχι έναν περιγραφέα αρχείου: αν ο τελευταίος κλωνοποιηθεί, με μία κλήση dup() ή fork(), δεν υπάρχουν πλέον δύο κλειδώματα αλλά δύο αναφορές στο ίδιο κλείδωμα. Τα κλειδώματα αρχείων είναι προσπελάσιμα μέσω της εξειδικευμένης κλήσης συστήματος <code>flock()</code> ή στο πλαίσιο της <code>fcntl()</code>, μίας γενικής χρήσης κλήσης χειρισμού αρχείων. Όταν μία διεργασία ανοίγει ένα αρχείο για ανάγνωση ζητά ένα κοινόχρηστο κλείδωμα, ενώ όταν το ανοίγει για εγγραφή ζητά ένα αποκλειστικό κλείδωμα. Στην τελευταία περίπτωση, αν το κλείδωμα του αρχείου το κατέχει κάποια άλλη διεργασία τότε η καλούσα μπλοκάρει μέχρι το κλείδωμα να ελευθερωθεί.