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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Σημειώσεις όγδοης εβδομάδας

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

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

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

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

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

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

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Προγραμματισμός I (Θ)

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

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

FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

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

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

ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ ΣΤΗΝ C

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

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

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Επεξεργασία κειμένου και συμβολοσειρών σε C

Ι Ανασκόπηση και εμβάθυνση Μερικά πιο προχωρημένα θέματα. ΙΙ Τα αρχεία δεδομένων στη C

Αρχεία εδοµένων. Προγραµµατισµός Ι 1

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Transcript:

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

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

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

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

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

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

int main(int argc, char *argv[]) { int fd[2],v1,v2; v1=atoi(argv[1]); v2=atoi(argv[2]); printf("adding %d plus %d\n",v1,v2); pipe(fd); write(fd[1],&v1,sizeof(int)); write(fd[1],&v2,sizeof(int)); read(fd[0],&v1,sizeof(int)); read(fd[0],&v2,sizeof(int)); v1=v1+v2; write(fd[1],&v1,sizeof(int)); read(fd[0],&v1,sizeof(int)); printf("the sum equals %d\n",v1); return(0); Προγραμματισμός ΙΙ 7 lalis@inf.uth.gr

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

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

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

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

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

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

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

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

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

int main(int argc, char *argv[]) { int fd[2]; char c; pipe(fd); if (!fork()) { dup2(fd[1],stdout_fileno); /* redirect stdout */ close(fd[0]); close(fd[1]); /* close pipe ends */ printf("hello from child"); return(0); dup2(fd[0],stdin_fileno); /* redirect stdin */ close(fd[0]); close(fd[1]); /* close pipe ends */ printf("parent reads: "); while ((c=getchar())!= EOF) { putchar(c); putchar('\n'); return(0); Προγραμματισμός ΙΙ 17 lalis@inf.uth.gr

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

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

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

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

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

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

int main(int argc, char *argv[]) { int fd[2],n; char c; pipe(fd); if (!fork()) { dup2(fd[1],stdout_fileno); /* redirect stdout */ close(fd[0]); close(fd[1]); /* close pipe ends */ execlp("./add","add","123","456",null); return(1); close(fd[1]); printf("parent reads:\n"); while ((n=read(fd[0],&c,sizeof(char)) > 0) { putchar(c); if (n < 0) { perror("read"); else { printf("end of input\n"); return(0); Προγραμματισμός ΙΙ 24 lalis@inf.uth.gr

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

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

int main(int argc, char *argv[]) { int fd,n; char str[n]; server mkfifo("testpipe",s_irwxu); /* create named pipe */ while (1) { fd=open("testpipe",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("testpipe",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); Προγραμματισμός ΙΙ 27 lalis@inf.uth.gr