Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Σχετικά έγγραφα
Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

Μη ανασταλτική/πολυπλεξία Ε/Ε (non-blocking/multiplexed I/O) Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

IPC System V. Προγραμματισμός II 1

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections)

Διάλεξη 18η: Διαχείρηση Αρχείων

Περιγραφείς Αρχείων & Ανακατεύθυνση EE. Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Ουρές Μηνυμάτων (Message Queues in System V) Προγραμματισμός II 1

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1

Υποδοχείς (Sockets) Προγραμματισμός II 1

Λειτουργικά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Προγραμματισμός Ι (ΗΥ120)

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

Αρχεία. Προγραμματισμός II 1

Αρχεία. Προγραμματισμός II 1

Επεξεργασία Αρχείων Κειµένου

Χώροι Πλειάδων (Tuple Spaces) Ταυτόχρονος Προγραμματισμός 1

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Η/Υ. Χειρισμός Αρχείων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Εκφωνήσεις ασκήσεων εργαστηρίου 1

File Management και I/O στο UNIX

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

Χώροι Πλειάδων (Tuple Spaces) Ταυτόχρονος Προγραμματισμός 1

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Προγραμματισμός Ι (ΗΥ120)

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Διαδικασιακός Προγραμματισμός

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Εργαστήριο 9: Αρχεία

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 12: Είσοδος και έξοδος δεδομένων σε αρχεία

Εισαγωγή στον Προγραμματισμό

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Αρχεία. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Μετακινούμενος Κώδικας (Mobile Code) Κατανεμημένα Συστήματα 1

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

S, (5, -3, 34, -23, 7) ( *, _

Ανάπτυξη και Σχεδίαση Λογισμικού

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου. Λειτουργικά Συστήματα Εργαστήριο Υπολογιστικών Συστημάτων ΕΜΠ

Ενδεικτικές λύσεις και στατιστικά

Προγραμματισμός Ι (ΗΥ120)

Λειτουργικά Συστήματα (Λ/Σ)

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Δομημένος Προγραμματισμός (ΤΛ1006)

Αρχιτεκτονική Υπολογιστών

Δομημένος Προγραμματισμός

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Προγραμματισμός Υπολογιστών με C++

Διαδικαστικός Προγραμματισμός

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Προγραμματισμός με BSD Sockets σε περιβάλλον Linux

ιαφάνειες παρουσίασης #6 (β)

Διαδικασιακός Προγραμματισμός

Λιβανός Γιώργος Εξάμηνο 2017Β

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Ιδιοκτησία Αντικειµένου

Streams Input / Output in C++ George Kastrinis

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Προγραμματισμός Ι (HY120)

Εισαγωγή στην Πληροφορική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

scanf() scanf() stdin scanf() printf() int float double %lf float

Δίκτυα Επικοινωνιών ΙΙ: Network Programming TCP Sockets

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Ανάπτυξη και Σχεδίαση Λογισμικού

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX. Συστήματα Αρχείων. Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης Δρ. Α. Γαλάνη

Προγραμματισμός σε C. Αρχεία κειμένου (Text files)

Εργαστήριο ΔΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ & ΚΑΤΑΛΟΓΩΝ ΣΤΟ UNIX. Εισαγωγή

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Αρχεία Δεδομένων. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Transcript:

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1 lalis@inf.uth.gr

Συνεργασία ανάμεσα σε διεργασίες Για ασφάλεια/ανεξαρτησία, το ΛΣ εξασφαλίζει πλήρη απομόνωση ανάμεσα στις διεργασίες Τι γίνεται αν κάποιες διεργασίες επιθυμούν να συνεργαστούν / αλληλεπιδράσουν μεταξύ τους; Το ΛΣ παρέχει ειδικούς μηχανισμούς επικοινωνίας μέσω των οποίων διαφορετικές διεργασίες μπορούν να αλληλεπιδράσουν / στείλουν δεδομένα inter-process communication (IPC) mechanisms Προγραμματισμός II 2 lalis@inf.uth.gr

IPC mechanisms Αρχεία files βλέπε προηγούμενες διαλέξεις Αγωγοί pipes ροές bytes μιας κατεύθυνσης Υποδοχείς sockets unix domain sockets, Internet domain sockets datagram sockets, stream sockets Ουρές μηνυμάτων message queues αποστολή/παραλαβή ομαδοποιημένων bytes Κοινόχρηστη μνήμη shared memory γράψιμο / διάβασμα απ ευθείας στην / από την μνήμη Προγραμματισμός II 3 lalis@inf.uth.gr

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 4 lalis@inf.uth.gr

Τι είναι ένας αγωγός; Μηχανισμός/συσκευή επικοινωνίας διεργασιών Μετάδοση μιας ροής από bytes (σε μια κατεύθυνση) First-in-first-out (FIFO): τα bytes βγαίνουν από τον αγωγό με την ίδια σειρά με την οποία μπήκαν είναι μια αποθήκη FIFO μέσα στο λειτουργικό Άκρο γραψίματος: «μπαίνουν» τα δεδομένα Άκρο διαβάσματος: «βγαίνουν» τα δεδομένα Προγραμματισμός II 5 lalis@inf.uth.gr

διεργασία P1 διεργασία P2 Προγραμματισμός ΙΙ 6 lalis@inf.uth.gr

Προσπέλαση αγωγού Για κάθε ένα από τα δύο άκρα του αγωγού επιστρέφεται ξεχωριστός περιγραφέας αρχείου Γράψιμο στον αγωγό: write Διάβασμα από τον αγωγό: read Κλείσιμο περιγραφέα: close Ισχύουν πολλά από όσα ήδη γνωρίζουμε για το γράψιμο/διάβασμα δεδομένων σε/από αρχεία δίσκου Υπάρχουν όμως και σημαντικές διαφορές Προγραμματισμός II 7 lalis@inf.uth.gr

read, write, close σε αγωγό Η read απομακρύνει τα bytes από τον αγωγό Η read μπλοκάρει αν δεν υπάρχουν bytes μέσα στον αγωγό (μέχρι να γραφτούν bytes στον αγωγό) ο αγωγός δεν έχει «τέλος» όμως, βλέπε close Η write μπλοκάρει αν ο αγωγός έχει γεμίσει (μέχρι να διαβαστούν/απομακρυνθούν κάποια bytes) ο αγωγός έχει περιορισμένη χωρητικότητα Η close έχει παρενέργειες αν κλείσουν όλοι οι περιγραφείς ανάγνωσης του αγωγού (δεν υπάρχει κανείς να διαβάσει), η write αποτυγχάνει αν κλείσουν όλοι οι περιγραφείς γραψίματος του αγωγού (δεν υπάρχει κανείς να γράψει), η read επιστρέφει 0 Δεν υποστηρίζεται η lseek γιατί; Προγραμματισμός II 8 lalis@inf.uth.gr

Ανώνυμοι αγωγοί int pipe(int fd[2]) Δημιουργεί έναν ανώνυμο αγωγό Ο περιγραφέας για το άκρο ανάγνωσης αποθηκεύεται στο fd[0] Ο περιγραφέας για το άκρο γραψίματος αποθηκεύεται στο fd[1] Ο ανώνυμος αγωγός έχει προσωρινή υπόσταση Καταστρέφεται αυτόματα όταν κλείσει και ο τελευταίος περιγραφέας πάνω στον αγωγό Προγραμματισμός II 9 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd[2],n,i; n = atoi(argv[1]); pipe(fd); if (!fork()) { close(fd[0]); /* close pipe read end */ for (i=0; i<n; i++) { res = write(fd[1],&i, sizeof(int)); if (res!= sizeof(int)) { return(1); return(0); close(fd[1]); /* close pipe write end */ while (1) { res = read(fd[0],&n,sizeof(int)); if (res == 0) { break; if (res!= sizeof(int)) { return(1); printf("parent: read %d\n",n); return(0); Προγραμματισμός ΙΙ 10 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int pid,fd[2],v1,v2,sum; v1 = atoi(argv[1]); v2 = atoi(argv[2]); pipe(fd); if (!(pid=fork())) { read(fd[0],&v1,sizeof(int)); read(fd[0],&v2,sizeof(int)); sum = v1+v2; write(fd[1],&sum,sizeof(int)); return(0); write(fd[1],&v1,sizeof(int)); write(fd[1],&v2,sizeof(int)); wait(pid,null,0); read(fd[0],&sum,sizeof(int)); printf("parent: read %d\n",sum); return(0); Προγραμματισμός ΙΙ 11 lalis@inf.uth.gr

διεργασία γονιός Προγραμματισμός ΙΙ 12 lalis@inf.uth.gr

διεργασία γονιός pipe 3 4 Προγραμματισμός ΙΙ 13 lalis@inf.uth.gr

διεργασία γονιός 3 4 Προγραμματισμός ΙΙ 14 lalis@inf.uth.gr

διεργασία γονιός 3 4 fork διεργασία παιδί 3 4 Προγραμματισμός ΙΙ 15 lalis@inf.uth.gr

διεργασία γονιός 3 4 διεργασία παιδί 3 4 Προγραμματισμός ΙΙ 16 lalis@inf.uth.gr

διεργασία γονιός 3 4 write διεργασία παιδί read 3 4 Προγραμματισμός ΙΙ 17 lalis@inf.uth.gr

διεργασία γονιός read 3 4 διεργασία παιδί 3 4 write Προγραμματισμός ΙΙ 18 lalis@inf.uth.gr

Ανακατεύθυνση εισόδου/εξόδου Τα άκρα του αγωγού προσπελάζονται μέσω περιγραφέων αρχείων, όπως και ένα αρχείο Μπορεί να γίνει ανακατεύθυνση της καθιερωμένης Ε/Ε ενός προγράμματος σε έναν αγωγό, μέσω dup2 όπως γίνεται ανακατεύθυνση σε αρχείο Αντί το πρόγραμμα να διαβάζει δεδομένα από το τερματικό, μπορεί να τα διαβάζει από έναν αγωγό Αντί το πρόγραμμα να γράφει δεδομένα στο τερματικό, μπορεί να τα γράφει σε έναν αγωγό Προγραμματισμός II 19 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd[2], i; char str[64]; pipe(fd); if (!fork()) { dup2(fd[1],stdout_fileno); /* redirect stdout */ close(fd[0]); close(fd[1]); /* close pipe ends */ for (i=1; i<argc; i++) { printf("%s\n",argv[i]); return(0); dup2(fd[0],stdin_fileno); /* redirect stdin */ close(fd[0]); close(fd[1]); /* close pipe ends */ while (scanf("%s",str)!= EOF) { printf("%s\n",str); return(0); Προγραμματισμός ΙΙ 20 lalis@inf.uth.gr

διεργασία γονιός 3 4 Προγραμματισμός ΙΙ 21 lalis@inf.uth.gr

fork διεργασία γονιός 3 4 διεργασία παιδί 3 4 Προγραμματισμός ΙΙ 22 lalis@inf.uth.gr

διεργασία γονιός dup2 3 4 διεργασία παιδί 3 4 dup2 Προγραμματισμός ΙΙ 23 lalis@inf.uth.gr

διεργασία γονιός close 3 4 close διεργασία παιδί close 3 4 close Προγραμματισμός ΙΙ 24 lalis@inf.uth.gr

διεργασία γονιός διεργασία παιδί Προγραμματισμός ΙΙ 25 lalis@inf.uth.gr

διεργασία γονιός scanf διεργασία παιδί printf Προγραμματισμός ΙΙ 26 lalis@inf.uth.gr

Επώνυμοι αγωγοί int mkfifo(cons char *path,mode_t perms); Δημιουργεί έναν επώνυμο αγωγό το όνομα και οι άδειες δίνονται όπως για ένα αρχείο η κλήση αποτυγχάνει αν ο αγωγός υπάρχει ήδη Η δημιουργία περιγραφέων για τα άκρα γραψίματος και ανάγνωσης του αγωγού γίνεται μέσω της open Άκρο ανάγνωσης: με O_RDONLY (μπλοκάρει αν δεν υπάρχει ανοιχτό άκρο γραψίματος για τον αγωγό) Άκρο γραψίματος: με O_WRONLY (μπλοκάρει αν δεν υπάρχει ανοιχτό άκρο ανάγνωσης για τον αγωγό) Ο επώνυμος αγωγός έχει μόνιμη υπόσταση Καταστρέφεται ρητά με unlink όπως τα αρχεία Προγραμματισμός II 28 lalis@inf.uth.gr

Χρησιμότητα επώνυμου αγωγού Προσυμφωνημένο «κανάλι/συχνότητα» επικοινωνίας Μπορεί να χρησιμοποιηθεί για την υλοποίηση σχημάτων επικοινωνίας client-server Οποιαδήποτε διεργασία μπορεί να ανοίξει έναν περιγραφέα στο άκρο ανάγνωσης γραψίματος του αγωγού Χρειάζεται κατάλληλος συντονισμός σε περίπτωση που πολλές διεργασίες επιθυμούν να γράψουν / διαβάσουν ταυτόχρονα στον / από τον αγωγό Προγραμματισμός II 29 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n; char str[n]; server mkfifo(argv[1],s_irwxu); /* create named pipe */ while (1) { fd = open(argv[1],o_rdonly); /* open pipe read end */ if (fd < 0) { perror("server: open"); return(1); while ((n = read(fd,str,n-1)) > 0) { str[n] = '\0'; printf("server read: %s\n",str); if (n < 0) { perror("server: read"); return(1); printf("server: end of input\n"); close(fd); int main(int argc, char *argv[]) { int fd,i; client fd = open(argv[1],o_wronly); /* open pipe write end */ if (fd < 0) { perror("client: open"); return(1); for (i=1; i<argc; i++) { write(fd,argv[i],strlen(argv[i])); return(0); Προγραμματισμός ΙΙ 30 lalis@inf.uth.gr