SlideShare une entreprise Scribd logo
1  sur  21
IPC
Γ.Μανάρας
1
 Τρόποι επικοινωνίας διεργασιών
 Pipes
 FIFOs
2
 Στο ίδιο μηχάνημα:
Pipes, σήματα, μηνύματα, global memory, αρχεία
 Σε διαφορετικά μηχανήματα
Named pipes (FIFOs)
sockets
IIOP (CORBA, OO wrappers για sockets)
COM+(Win32)
Mail-slots(Win32)
Web Services
3
 Ανοίξτε ένα x-terminal και τρέξτε την εντολή
$ ls –l | wc –l
Τι θα συμβεί?
 Στο Α’ μέρος του σημερινού μαθήματος θα εξηγήσουμε πως ακριβώς
υλοποιούνται όλα αυτά σε επίπεδο λειτουργικού συστήματος
 Pipe: ειδικός τύπος αρχείου FIFO που χρησιμοποιείται
για την σειριακή μεταφορά δεδομένων μεταξύ δύο διεργασιών,
προς μια κατεύθυνση
 Μπορεί να είναι είτε μόνιμο (δηλαδή με όνομα)
είτε προσωρινό
4
5
 int pipe(int fd[]);
 Η κλήση pipe() λαμβάνει ως παράμετρο ένα array fd δύο ακεραίων και επιστρέφει δύο file
descriptors
 Το fd[0] READ , προσδιορίζει το άκρο του pipe από όπου διαβάζουμε
 Το fd[1] WRITE, προσδιορίζει το άκρο στο οποίο γράφουμε
 Τα στοιχεία που γράφονται στο ένα άκρο της σωλήνωσης
μπορούν να διαβαστούν από το άλλο.
 Τα μη χρησιμοποιούμενα άκρα πρέπει να ελευθερώνονται με την
close().
 Το pipe() επιστρέφει 0 σε επιτυχία ή -1 σε αποτυχία.
6
 Παράδειγμα 1: pipe1.c
#include <stdio.h>
main()
{
int fd[2], n;
char message[100];
pipe(fd);
write(fd[1], "This is a pipe message", 22);
n = read(fd[0], message, 100);
/* write the message to stdout */
write(1, message, n);
}
 Η εκτέλεση του προγράμματος θα μας δώσει: This is a pipe message
7
 Η function perror(const char * str)
 Μερικές C functions, όταν συμβεί κάποιο λάθος,
θέτουν μία τιμή στη global var errno.
 Η δουλειά της perror() είναι να εμφανίσει
- το αλφαριθμητικό str που της περάσαμε καθώς και
- το μήνυμα που αντιστοιχεί στην τιμή που έχει η errno.
 Παράδειγμα
 FILE * pFile = fopen ("unexist.ent","rb");
if (pFile==NULL)
perror ("The following error occurred");
else
fclose (pFile);
 Τελικά θα εμφανιστεί: «The following error occurred: No such file or directory»
Η βασική χρησιμότητα του δικού μας μηνύματος είναι να μας βοηθάει να εντοπίσουμε το
σημείο του κώδικα που έγινε το λάθος.
8
 Παράδειγμα 2: pipe2.c
#include <stdio.h>
char *line = "This is an IPC message, with pipe";
main()
{
int pid, fd[2], n;
char message[100];
if (pipe(fd) == -1)
{
perror("pipe");
exit(1);
}
pid = fork();
if ( pid == -1)
{
perror("fork");
exit(2);
}
9
if (pid == 0)
{ /* Child process is the writer */
close(fd[0]);
write(fd[1], line, strlen(line)+1);
close(fd[1]);
}
else
{ /* Parent process is the reader */
close(fd[1]);
n = read(fd[0], message, sizeof(message));
write(1, message, n); // write the message to the stdout
close(fd[0]);
}
}
 Η εκτέλεση του προγράμματος θα μας δώσει:
 This is an IPC message, with pipe
10
 H function int dup2(int fildes, int fildes2);
 Κάνει το fildes alias του fildes2
 Παράδειγμα
Αν θέλουμε να κατευθύνουμε το standard output σε ένα αρχείο
int file = open("myfile.txt", O_APPEND | O_WRONLY);
if(file < 0) return 1; //Now we redirect standard output to the file using dup2
if(dup2(file,1) < 0) return 1;
//Now standard out has been redirected, we can write to the file
printf("This will be printed in myfile.txt“);
11
Παράδειγμα 3: pipe3.c
#include <stdio.h>
main()
{
int fd[2], pid;
char message[100];
if (pipe(fd) == -1)
{ /* Create a pipe */
perror("pipe");
exit(1);
}
if ((pid = fork()) == -1)
{ /* Fork a child */
perror("fork");
exit(2);
}
12
if (pid == 0)
{ /* Child process is the reader */
close(fd[1]);
dup2(fd[0],0); /* stdin becomes fd[0] */
close(fd[0]);
printf("I am the child…n");
scanf("%s",message);
printf("From parent: %sn", message);
scanf("%s", message);
printf("From parent: %sn", message);
scanf("%s", message);
printf("From parent: %sn", message);
exit(0);
}
else
{ /* Parent process is the writer */
close(fd[0]);
dup2(fd[1],1); /* stdout becomes fd[1] */
close(fd[1]);
printf("Hello my childn");
}
}
13
 Παράδειγμα 4: pipe4.c
#include <stdio.h>
main()
{
int fd[2], pid;
char *argv[3];
if (pipe(fd) == -1)
{ /* Create a pipe */
perror("pipe");
exit(1);
}
if ((pid = fork()) == -1)
{ /* Fork a child */
perror("fork");
exit(2);
}
14
if (pid == 0)
{ /* Child process is the reader */
close(fd[1]); /* Close the writing side */
dup2(fd[0],0); /* stdin becomes fd[0] */
close(fd[0]); /* now, close the fd[0] */
execlp("wc", "wc" , NULL);
perror("execlp");
}
else
{ /* Parent process is the writer */
close(fd[0]); /* Close the reading side */
dup2(fd[1],1); /* stdout becomes fd[1] */
close(fd[1]); /* now, close the fd[1] */
argv[0] = "ls";
argv[1] = "-l";
argv[2] = NULL;
execvp("ls", argv);
perror("execvp");
}
}
15
 Με τη χρήση των FIFO μπορούν να ανταλλάξουν δεδομένα και διεργασίες
που δεν έχουν «συγγενική» σχέση μεταξύ τους
 Η κλήση συστήματος mkfifo() δημιουργεί έναν επώνυμο σωλήνα που έχει τις
ίδιες ιδιότητες με έναν ανώνυμο σωλήνα (half-duplex, fist in – first out),
με τη διαφορά ότι στην ουσία πρόκειται για ένα αρχείο στο δίσκο
 int mkfifo(const char *path, mode_t mode);
16
 Παράδειγμα 5: fifo1.c
main()
{
int fd, n;
char buff[100], msg[]="Text for FIFO";
unlink("FIFO"); /* remove, if exist */
if (mkfifo("FIFO", 0764) == -1)
{
perror("mkfifo");
exit(1);
}
if ((fd=open("FIFO", O_RDWR)) == -1)
{
perror("open");
exit(2);
}
n=write(fd,msg,strlen(msg));
if (read(fd, buff, n)==-1)
fprintf(stderr,"Can't read from Fifo.n");
else
printf("Read from FIFO: %sn", buff);
}
17
 Παράδειγμα 6: receiver.c
int main()
{
int fd;
char buffer[100];
unlink("FIFO");
if (mkfifo("FIFO", 0755) == -1)
{
fprintf(stderr,"Receiver: Coudn't create fifo.n");
exit(2);
}
if ((fd = open("FIFO", O_RDWR)) == -1)
{
fprintf(stderr, "Receiver: fifo open failed.n");
exit(1);
}
18
 Παράδειγμα 6: receiver.c
while(1)
{
if (read(fd, buffer, 100) == -1)
{
fprintf(stderr,"Receiver: fifo reading failed.n");
exit(2);
}
printf("Received message: %sn", buffer);
if (!strcmp(buffer,"exit")) exit(0);
}
return 0;
}
19
 Παράδειγμα 6: sender.c
int main(int argc, char *argv[])
{
int fd, i, n;
char buffer[100];
if (argc < 2)
{
fprintf(stderr, "Usage: %s message ...n", argv[0]);
exit(1);
}
if ((fd = open("FIFO", O_RDWR | O_NONBLOCK)) == -1)
{
fprintf(stderr, "Sender: fifo open failed.n");
exit(3);
}
20
 Παράδειγμα 6: sender.c
for (i = 1; i < argc; i++)
{
strcpy(buffer, argv[i]);
if ((n = write(fd, buffer, 100)) == -1)
{
fprintf(stderr, "Sender: Write to fifo failed.n");
exit(4);
}
}
return 0;
}
21

Contenu connexe

En vedette

Presentacion 2007
Presentacion 2007Presentacion 2007
Presentacion 2007
orbit6
 
El arte románico del camino de santiago
El arte románico del camino de santiagoEl arte románico del camino de santiago
El arte románico del camino de santiago
marianu77
 
Le Portfolio By Mickey Destro
Le Portfolio By Mickey DestroLe Portfolio By Mickey Destro
Le Portfolio By Mickey Destro
mickeydestro
 
Monotremak
MonotremakMonotremak
Monotremak
itxasi
 
El arte religioso
El arte religiosoEl arte religioso
El arte religioso
carmenocaz
 
Cantar os reis
Cantar os reisCantar os reis
Cantar os reis
macisabel
 
Así somos os seres vivos
Así somos os seres vivosAsí somos os seres vivos
Así somos os seres vivos
Fabian Gallie
 
El bombero-de-arizona
El bombero-de-arizonaEl bombero-de-arizona
El bombero-de-arizona
JudithMaeso
 
A historia de Aixa, unha nena saharauí
A historia de Aixa, unha nena saharauíA historia de Aixa, unha nena saharauí
A historia de Aixa, unha nena saharauí
María Rei Vilas
 
Sen títul
Sen títulSen títul
Sen títul
fesquio
 

En vedette (20)

Anselmi cantuariensis proslogion
Anselmi cantuariensis proslogionAnselmi cantuariensis proslogion
Anselmi cantuariensis proslogion
 
Presentacion 2007
Presentacion 2007Presentacion 2007
Presentacion 2007
 
Competizione
CompetizioneCompetizione
Competizione
 
El arte románico del camino de santiago
El arte románico del camino de santiagoEl arte románico del camino de santiago
El arte románico del camino de santiago
 
Electromedicina isaac ojea universidad politecnica salesiana.docx
Electromedicina  isaac ojea universidad politecnica salesiana.docxElectromedicina  isaac ojea universidad politecnica salesiana.docx
Electromedicina isaac ojea universidad politecnica salesiana.docx
 
Presentación1
Presentación1Presentación1
Presentación1
 
Migracions
MigracionsMigracions
Migracions
 
Piscinas
PiscinasPiscinas
Piscinas
 
Le Portfolio By Mickey Destro
Le Portfolio By Mickey DestroLe Portfolio By Mickey Destro
Le Portfolio By Mickey Destro
 
Monotremak
MonotremakMonotremak
Monotremak
 
Apres flores
Apres floresApres flores
Apres flores
 
Torneo 2011 pw
Torneo 2011 pwTorneo 2011 pw
Torneo 2011 pw
 
El arte religioso
El arte religiosoEl arte religioso
El arte religioso
 
Cantar os reis
Cantar os reisCantar os reis
Cantar os reis
 
Así somos os seres vivos
Así somos os seres vivosAsí somos os seres vivos
Así somos os seres vivos
 
Les fures.
Les fures.Les fures.
Les fures.
 
El bombero-de-arizona
El bombero-de-arizonaEl bombero-de-arizona
El bombero-de-arizona
 
A nova ldb_e_as_necessidades_educativas_especiais
A nova ldb_e_as_necessidades_educativas_especiaisA nova ldb_e_as_necessidades_educativas_especiais
A nova ldb_e_as_necessidades_educativas_especiais
 
A historia de Aixa, unha nena saharauí
A historia de Aixa, unha nena saharauíA historia de Aixa, unha nena saharauí
A historia de Aixa, unha nena saharauí
 
Sen títul
Sen títulSen títul
Sen títul
 

Plus de Yanis Manaras (20)

Webclass admin 4
Webclass admin 4Webclass admin 4
Webclass admin 4
 
What iswebclass 4
What iswebclass 4What iswebclass 4
What iswebclass 4
 
Webclass teacher 4
Webclass teacher 4Webclass teacher 4
Webclass teacher 4
 
Webclass student 4
Webclass student 4Webclass student 4
Webclass student 4
 
Webclass Student
Webclass StudentWebclass Student
Webclass Student
 
Ads 1 fibonacci
Ads 1 fibonacciAds 1 fibonacci
Ads 1 fibonacci
 
Ads 1 alt_e
Ads 1 alt_eAds 1 alt_e
Ads 1 alt_e
 
Ads 1 common
Ads 1 commonAds 1 common
Ads 1 common
 
HTML and Javascript
HTML and JavascriptHTML and Javascript
HTML and Javascript
 
Signals
SignalsSignals
Signals
 
ΛΣ2_IPC
ΛΣ2_IPCΛΣ2_IPC
ΛΣ2_IPC
 
ΛΣ1-002
ΛΣ1-002ΛΣ1-002
ΛΣ1-002
 
Processes
ProcessesProcesses
Processes
 
ΛΣ1-001
ΛΣ1-001ΛΣ1-001
ΛΣ1-001
 
SE5
SE5SE5
SE5
 
SE4
SE4SE4
SE4
 
SQL7v2
SQL7v2SQL7v2
SQL7v2
 
SQL9v0
SQL9v0SQL9v0
SQL9v0
 
SQL8v1
SQL8v1SQL8v1
SQL8v1
 
SQL6v1
SQL6v1SQL6v1
SQL6v1
 

Dernier

εργασία εφημερίδας για την διατροφή.pptx
εργασία εφημερίδας για την διατροφή.pptxεργασία εφημερίδας για την διατροφή.pptx
εργασία εφημερίδας για την διατροφή.pptx
Effie Lampropoulou
 

Dernier (20)

Η ΚΩΝΣΤΑΝΤΙΝΟΥΠΟΛΗ, ΣΤΑΥΡΟΥΛΑ ΜΠΕΚΙΑΡΗ
Η ΚΩΝΣΤΑΝΤΙΝΟΥΠΟΛΗ,  ΣΤΑΥΡΟΥΛΑ  ΜΠΕΚΙΑΡΗΗ ΚΩΝΣΤΑΝΤΙΝΟΥΠΟΛΗ,  ΣΤΑΥΡΟΥΛΑ  ΜΠΕΚΙΑΡΗ
Η ΚΩΝΣΤΑΝΤΙΝΟΥΠΟΛΗ, ΣΤΑΥΡΟΥΛΑ ΜΠΕΚΙΑΡΗ
 
Μάχη του Πουατιέ,ΧΡΥΣΑΝΘΟΣ ΚΑΙ ΧΡΥΣΑ ΟΠΡΙΝΕΣΚΟΥ
Μάχη του Πουατιέ,ΧΡΥΣΑΝΘΟΣ ΚΑΙ ΧΡΥΣΑ ΟΠΡΙΝΕΣΚΟΥΜάχη του Πουατιέ,ΧΡΥΣΑΝΘΟΣ ΚΑΙ ΧΡΥΣΑ ΟΠΡΙΝΕΣΚΟΥ
Μάχη του Πουατιέ,ΧΡΥΣΑΝΘΟΣ ΚΑΙ ΧΡΥΣΑ ΟΠΡΙΝΕΣΚΟΥ
 
Παρουσίαση θεατρικού στην Τεχνόπολη. 2023-2024
Παρουσίαση θεατρικού στην Τεχνόπολη. 2023-2024Παρουσίαση θεατρικού στην Τεχνόπολη. 2023-2024
Παρουσίαση θεατρικού στην Τεχνόπολη. 2023-2024
 
ΕΜΕΙΣ ΕΔΩ ΠΑΙΖΟΥΜΕ ΜΠΑΛΑ, εργασία για την οπαδική βία
ΕΜΕΙΣ ΕΔΩ ΠΑΙΖΟΥΜΕ ΜΠΑΛΑ, εργασία για την οπαδική βίαΕΜΕΙΣ ΕΔΩ ΠΑΙΖΟΥΜΕ ΜΠΑΛΑ, εργασία για την οπαδική βία
ΕΜΕΙΣ ΕΔΩ ΠΑΙΖΟΥΜΕ ΜΠΑΛΑ, εργασία για την οπαδική βία
 
ΙΣΤΟΡΙΑ Γ΄ΓΥΜΝΑΣΙΟΥ: ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2ο
ΙΣΤΟΡΙΑ Γ΄ΓΥΜΝΑΣΙΟΥ: ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ  ΜΕΡΟΣ 2οΙΣΤΟΡΙΑ Γ΄ΓΥΜΝΑΣΙΟΥ: ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ  ΜΕΡΟΣ 2ο
ΙΣΤΟΡΙΑ Γ΄ΓΥΜΝΑΣΙΟΥ: ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2ο
 
ΗΡΑΚΛΕΙΟΣ, ΧΑΡΗΣ ΤΑΣΙΟΥΔΗΣ-ΓΙΩΡΓΟΣ ΤΖΑΝΗΣ
ΗΡΑΚΛΕΙΟΣ, ΧΑΡΗΣ ΤΑΣΙΟΥΔΗΣ-ΓΙΩΡΓΟΣ ΤΖΑΝΗΣΗΡΑΚΛΕΙΟΣ, ΧΑΡΗΣ ΤΑΣΙΟΥΔΗΣ-ΓΙΩΡΓΟΣ ΤΖΑΝΗΣ
ΗΡΑΚΛΕΙΟΣ, ΧΑΡΗΣ ΤΑΣΙΟΥΔΗΣ-ΓΙΩΡΓΟΣ ΤΖΑΝΗΣ
 
Ο ΧΡΙΣΤΟΦΟΡΟΣ ΚΟΛΟΜΒΟΣ ΚΑΙ Η ΑΝΑΚΑΛΥΨΗ ΤΗΣ ΑΜΕΡΙΚΗΣ,ΕΙΡΗΝΗ ΝΤΟΥΣΚΑ-ΠΕΝΥ ΖΑΓΓΟ...
Ο ΧΡΙΣΤΟΦΟΡΟΣ ΚΟΛΟΜΒΟΣ ΚΑΙ Η ΑΝΑΚΑΛΥΨΗ ΤΗΣ ΑΜΕΡΙΚΗΣ,ΕΙΡΗΝΗ ΝΤΟΥΣΚΑ-ΠΕΝΥ ΖΑΓΓΟ...Ο ΧΡΙΣΤΟΦΟΡΟΣ ΚΟΛΟΜΒΟΣ ΚΑΙ Η ΑΝΑΚΑΛΥΨΗ ΤΗΣ ΑΜΕΡΙΚΗΣ,ΕΙΡΗΝΗ ΝΤΟΥΣΚΑ-ΠΕΝΥ ΖΑΓΓΟ...
Ο ΧΡΙΣΤΟΦΟΡΟΣ ΚΟΛΟΜΒΟΣ ΚΑΙ Η ΑΝΑΚΑΛΥΨΗ ΤΗΣ ΑΜΕΡΙΚΗΣ,ΕΙΡΗΝΗ ΝΤΟΥΣΚΑ-ΠΕΝΥ ΖΑΓΓΟ...
 
ΠΟΤΕ ΑΝΑΚΑΛΥΦΘΗΚΕ Η ΑΜΕΡΙΚΗ,ΦΙΛΩΝ-ΦΡΑΓΚΟΥ
ΠΟΤΕ ΑΝΑΚΑΛΥΦΘΗΚΕ Η ΑΜΕΡΙΚΗ,ΦΙΛΩΝ-ΦΡΑΓΚΟΥΠΟΤΕ ΑΝΑΚΑΛΥΦΘΗΚΕ Η ΑΜΕΡΙΚΗ,ΦΙΛΩΝ-ΦΡΑΓΚΟΥ
ΠΟΤΕ ΑΝΑΚΑΛΥΦΘΗΚΕ Η ΑΜΕΡΙΚΗ,ΦΙΛΩΝ-ΦΡΑΓΚΟΥ
 
Παρουσίαση δράσεων στην Τεχνόπολη. 2023-2024
Παρουσίαση δράσεων στην Τεχνόπολη. 2023-2024Παρουσίαση δράσεων στην Τεχνόπολη. 2023-2024
Παρουσίαση δράσεων στην Τεχνόπολη. 2023-2024
 
ΘΕΣΣΑΛΟΝΙΚΗ Η ΔΕΥΤΕΡΗ ΠΟΛΗ ΤΗΣ ΒΥΖΑΝΤΙΝΗΣ ΑΥΤΟΚΡΑΤΟΡΙΑΣ, ΔΑΝΑΗ ΠΑΝΟΥ
ΘΕΣΣΑΛΟΝΙΚΗ Η ΔΕΥΤΕΡΗ ΠΟΛΗ ΤΗΣ ΒΥΖΑΝΤΙΝΗΣ ΑΥΤΟΚΡΑΤΟΡΙΑΣ, ΔΑΝΑΗ ΠΑΝΟΥΘΕΣΣΑΛΟΝΙΚΗ Η ΔΕΥΤΕΡΗ ΠΟΛΗ ΤΗΣ ΒΥΖΑΝΤΙΝΗΣ ΑΥΤΟΚΡΑΤΟΡΙΑΣ, ΔΑΝΑΗ ΠΑΝΟΥ
ΘΕΣΣΑΛΟΝΙΚΗ Η ΔΕΥΤΕΡΗ ΠΟΛΗ ΤΗΣ ΒΥΖΑΝΤΙΝΗΣ ΑΥΤΟΚΡΑΤΟΡΙΑΣ, ΔΑΝΑΗ ΠΑΝΟΥ
 
Φλωρεντία, ΔΑΝΑΗ ΠΥΡΠΥΡΗ- ΜΑΡΙΑΝΕΛΑ ΣΤΡΟΓΓΥΛΟΥ
Φλωρεντία, ΔΑΝΑΗ ΠΥΡΠΥΡΗ- ΜΑΡΙΑΝΕΛΑ ΣΤΡΟΓΓΥΛΟΥΦλωρεντία, ΔΑΝΑΗ ΠΥΡΠΥΡΗ- ΜΑΡΙΑΝΕΛΑ ΣΤΡΟΓΓΥΛΟΥ
Φλωρεντία, ΔΑΝΑΗ ΠΥΡΠΥΡΗ- ΜΑΡΙΑΝΕΛΑ ΣΤΡΟΓΓΥΛΟΥ
 
Η ΑΔΙΚΕΙΑ ΤΟΥ ΔΙΑΓΩΝΙΣΜΟΥ ΑΣΕΠ 2008 ΓΙΑ ΕΚΠΑΙΔΕΥΤΙΚΟΥΣ
Η ΑΔΙΚΕΙΑ ΤΟΥ ΔΙΑΓΩΝΙΣΜΟΥ ΑΣΕΠ 2008 ΓΙΑ ΕΚΠΑΙΔΕΥΤΙΚΟΥΣΗ ΑΔΙΚΕΙΑ ΤΟΥ ΔΙΑΓΩΝΙΣΜΟΥ ΑΣΕΠ 2008 ΓΙΑ ΕΚΠΑΙΔΕΥΤΙΚΟΥΣ
Η ΑΔΙΚΕΙΑ ΤΟΥ ΔΙΑΓΩΝΙΣΜΟΥ ΑΣΕΠ 2008 ΓΙΑ ΕΚΠΑΙΔΕΥΤΙΚΟΥΣ
 
Βενετία, μια πόλη πάνω στο νερό, Βασιλική Μπράβου - Αποστολία Μπάρδα
Βενετία, μια πόλη πάνω στο νερό, Βασιλική Μπράβου - Αποστολία ΜπάρδαΒενετία, μια πόλη πάνω στο νερό, Βασιλική Μπράβου - Αποστολία Μπάρδα
Βενετία, μια πόλη πάνω στο νερό, Βασιλική Μπράβου - Αποστολία Μπάρδα
 
εργασία εφημερίδας για την διατροφή.pptx
εργασία εφημερίδας για την διατροφή.pptxεργασία εφημερίδας για την διατροφή.pptx
εργασία εφημερίδας για την διατροφή.pptx
 
Ρατσισμός, ορισμός, είδη, αίτια , συνέπειες
Ρατσισμός, ορισμός, είδη, αίτια , συνέπειεςΡατσισμός, ορισμός, είδη, αίτια , συνέπειες
Ρατσισμός, ορισμός, είδη, αίτια , συνέπειες
 
Safe Driving - Εργασία για την ασφαλή οδήγηση 2ο Γυμνάσιο Αλεξανδρούπολης
Safe Driving - Εργασία για την ασφαλή οδήγηση 2ο Γυμνάσιο ΑλεξανδρούποληςSafe Driving - Εργασία για την ασφαλή οδήγηση 2ο Γυμνάσιο Αλεξανδρούπολης
Safe Driving - Εργασία για την ασφαλή οδήγηση 2ο Γυμνάσιο Αλεξανδρούπολης
 
Σχέσεις στην εφηβεία_έρωτας
Σχέσεις                     στην εφηβεία_έρωταςΣχέσεις                     στην εφηβεία_έρωτας
Σχέσεις στην εφηβεία_έρωτας
 
Inclusion - Εργασία για τη συμπερίληψη 2ο Γυμνάσιο Αλεξανδρούπολης
Inclusion - Εργασία για τη συμπερίληψη 2ο Γυμνάσιο ΑλεξανδρούποληςInclusion - Εργασία για τη συμπερίληψη 2ο Γυμνάσιο Αλεξανδρούπολης
Inclusion - Εργασία για τη συμπερίληψη 2ο Γυμνάσιο Αλεξανδρούπολης
 
ΧΑΝΟΣ ΚΡΟΥΜΟΣ-ΒΑΣΙΛΙΑΣ ΝΙΚΗΦΟΡΟΣ,ΚΡΙΣΤΙΝΑ ΚΡΑΣΤΕΒΑ
ΧΑΝΟΣ ΚΡΟΥΜΟΣ-ΒΑΣΙΛΙΑΣ ΝΙΚΗΦΟΡΟΣ,ΚΡΙΣΤΙΝΑ ΚΡΑΣΤΕΒΑΧΑΝΟΣ ΚΡΟΥΜΟΣ-ΒΑΣΙΛΙΑΣ ΝΙΚΗΦΟΡΟΣ,ΚΡΙΣΤΙΝΑ ΚΡΑΣΤΕΒΑ
ΧΑΝΟΣ ΚΡΟΥΜΟΣ-ΒΑΣΙΛΙΑΣ ΝΙΚΗΦΟΡΟΣ,ΚΡΙΣΤΙΝΑ ΚΡΑΣΤΕΒΑ
 
ΑΝΑΓΕΝΝΗΣΗ, ΕΙΡΗΝΗ ΓΚΑΒΛΟΥ- ΜΑΙΡΗ ΔΗΜΑΚΟΠΟΥΛΟΥ
ΑΝΑΓΕΝΝΗΣΗ, ΕΙΡΗΝΗ ΓΚΑΒΛΟΥ- ΜΑΙΡΗ ΔΗΜΑΚΟΠΟΥΛΟΥ ΑΝΑΓΕΝΝΗΣΗ, ΕΙΡΗΝΗ ΓΚΑΒΛΟΥ- ΜΑΙΡΗ ΔΗΜΑΚΟΠΟΥΛΟΥ
ΑΝΑΓΕΝΝΗΣΗ, ΕΙΡΗΝΗ ΓΚΑΒΛΟΥ- ΜΑΙΡΗ ΔΗΜΑΚΟΠΟΥΛΟΥ
 

ΛΣ2IPCv0

  • 2.  Τρόποι επικοινωνίας διεργασιών  Pipes  FIFOs 2
  • 3.  Στο ίδιο μηχάνημα: Pipes, σήματα, μηνύματα, global memory, αρχεία  Σε διαφορετικά μηχανήματα Named pipes (FIFOs) sockets IIOP (CORBA, OO wrappers για sockets) COM+(Win32) Mail-slots(Win32) Web Services 3
  • 4.  Ανοίξτε ένα x-terminal και τρέξτε την εντολή $ ls –l | wc –l Τι θα συμβεί?  Στο Α’ μέρος του σημερινού μαθήματος θα εξηγήσουμε πως ακριβώς υλοποιούνται όλα αυτά σε επίπεδο λειτουργικού συστήματος  Pipe: ειδικός τύπος αρχείου FIFO που χρησιμοποιείται για την σειριακή μεταφορά δεδομένων μεταξύ δύο διεργασιών, προς μια κατεύθυνση  Μπορεί να είναι είτε μόνιμο (δηλαδή με όνομα) είτε προσωρινό 4
  • 5. 5
  • 6.  int pipe(int fd[]);  Η κλήση pipe() λαμβάνει ως παράμετρο ένα array fd δύο ακεραίων και επιστρέφει δύο file descriptors  Το fd[0] READ , προσδιορίζει το άκρο του pipe από όπου διαβάζουμε  Το fd[1] WRITE, προσδιορίζει το άκρο στο οποίο γράφουμε  Τα στοιχεία που γράφονται στο ένα άκρο της σωλήνωσης μπορούν να διαβαστούν από το άλλο.  Τα μη χρησιμοποιούμενα άκρα πρέπει να ελευθερώνονται με την close().  Το pipe() επιστρέφει 0 σε επιτυχία ή -1 σε αποτυχία. 6
  • 7.  Παράδειγμα 1: pipe1.c #include <stdio.h> main() { int fd[2], n; char message[100]; pipe(fd); write(fd[1], "This is a pipe message", 22); n = read(fd[0], message, 100); /* write the message to stdout */ write(1, message, n); }  Η εκτέλεση του προγράμματος θα μας δώσει: This is a pipe message 7
  • 8.  Η function perror(const char * str)  Μερικές C functions, όταν συμβεί κάποιο λάθος, θέτουν μία τιμή στη global var errno.  Η δουλειά της perror() είναι να εμφανίσει - το αλφαριθμητικό str που της περάσαμε καθώς και - το μήνυμα που αντιστοιχεί στην τιμή που έχει η errno.  Παράδειγμα  FILE * pFile = fopen ("unexist.ent","rb"); if (pFile==NULL) perror ("The following error occurred"); else fclose (pFile);  Τελικά θα εμφανιστεί: «The following error occurred: No such file or directory» Η βασική χρησιμότητα του δικού μας μηνύματος είναι να μας βοηθάει να εντοπίσουμε το σημείο του κώδικα που έγινε το λάθος. 8
  • 9.  Παράδειγμα 2: pipe2.c #include <stdio.h> char *line = "This is an IPC message, with pipe"; main() { int pid, fd[2], n; char message[100]; if (pipe(fd) == -1) { perror("pipe"); exit(1); } pid = fork(); if ( pid == -1) { perror("fork"); exit(2); } 9
  • 10. if (pid == 0) { /* Child process is the writer */ close(fd[0]); write(fd[1], line, strlen(line)+1); close(fd[1]); } else { /* Parent process is the reader */ close(fd[1]); n = read(fd[0], message, sizeof(message)); write(1, message, n); // write the message to the stdout close(fd[0]); } }  Η εκτέλεση του προγράμματος θα μας δώσει:  This is an IPC message, with pipe 10
  • 11.  H function int dup2(int fildes, int fildes2);  Κάνει το fildes alias του fildes2  Παράδειγμα Αν θέλουμε να κατευθύνουμε το standard output σε ένα αρχείο int file = open("myfile.txt", O_APPEND | O_WRONLY); if(file < 0) return 1; //Now we redirect standard output to the file using dup2 if(dup2(file,1) < 0) return 1; //Now standard out has been redirected, we can write to the file printf("This will be printed in myfile.txt“); 11
  • 12. Παράδειγμα 3: pipe3.c #include <stdio.h> main() { int fd[2], pid; char message[100]; if (pipe(fd) == -1) { /* Create a pipe */ perror("pipe"); exit(1); } if ((pid = fork()) == -1) { /* Fork a child */ perror("fork"); exit(2); } 12
  • 13. if (pid == 0) { /* Child process is the reader */ close(fd[1]); dup2(fd[0],0); /* stdin becomes fd[0] */ close(fd[0]); printf("I am the child…n"); scanf("%s",message); printf("From parent: %sn", message); scanf("%s", message); printf("From parent: %sn", message); scanf("%s", message); printf("From parent: %sn", message); exit(0); } else { /* Parent process is the writer */ close(fd[0]); dup2(fd[1],1); /* stdout becomes fd[1] */ close(fd[1]); printf("Hello my childn"); } } 13
  • 14.  Παράδειγμα 4: pipe4.c #include <stdio.h> main() { int fd[2], pid; char *argv[3]; if (pipe(fd) == -1) { /* Create a pipe */ perror("pipe"); exit(1); } if ((pid = fork()) == -1) { /* Fork a child */ perror("fork"); exit(2); } 14
  • 15. if (pid == 0) { /* Child process is the reader */ close(fd[1]); /* Close the writing side */ dup2(fd[0],0); /* stdin becomes fd[0] */ close(fd[0]); /* now, close the fd[0] */ execlp("wc", "wc" , NULL); perror("execlp"); } else { /* Parent process is the writer */ close(fd[0]); /* Close the reading side */ dup2(fd[1],1); /* stdout becomes fd[1] */ close(fd[1]); /* now, close the fd[1] */ argv[0] = "ls"; argv[1] = "-l"; argv[2] = NULL; execvp("ls", argv); perror("execvp"); } } 15
  • 16.  Με τη χρήση των FIFO μπορούν να ανταλλάξουν δεδομένα και διεργασίες που δεν έχουν «συγγενική» σχέση μεταξύ τους  Η κλήση συστήματος mkfifo() δημιουργεί έναν επώνυμο σωλήνα που έχει τις ίδιες ιδιότητες με έναν ανώνυμο σωλήνα (half-duplex, fist in – first out), με τη διαφορά ότι στην ουσία πρόκειται για ένα αρχείο στο δίσκο  int mkfifo(const char *path, mode_t mode); 16
  • 17.  Παράδειγμα 5: fifo1.c main() { int fd, n; char buff[100], msg[]="Text for FIFO"; unlink("FIFO"); /* remove, if exist */ if (mkfifo("FIFO", 0764) == -1) { perror("mkfifo"); exit(1); } if ((fd=open("FIFO", O_RDWR)) == -1) { perror("open"); exit(2); } n=write(fd,msg,strlen(msg)); if (read(fd, buff, n)==-1) fprintf(stderr,"Can't read from Fifo.n"); else printf("Read from FIFO: %sn", buff); } 17
  • 18.  Παράδειγμα 6: receiver.c int main() { int fd; char buffer[100]; unlink("FIFO"); if (mkfifo("FIFO", 0755) == -1) { fprintf(stderr,"Receiver: Coudn't create fifo.n"); exit(2); } if ((fd = open("FIFO", O_RDWR)) == -1) { fprintf(stderr, "Receiver: fifo open failed.n"); exit(1); } 18
  • 19.  Παράδειγμα 6: receiver.c while(1) { if (read(fd, buffer, 100) == -1) { fprintf(stderr,"Receiver: fifo reading failed.n"); exit(2); } printf("Received message: %sn", buffer); if (!strcmp(buffer,"exit")) exit(0); } return 0; } 19
  • 20.  Παράδειγμα 6: sender.c int main(int argc, char *argv[]) { int fd, i, n; char buffer[100]; if (argc < 2) { fprintf(stderr, "Usage: %s message ...n", argv[0]); exit(1); } if ((fd = open("FIFO", O_RDWR | O_NONBLOCK)) == -1) { fprintf(stderr, "Sender: fifo open failed.n"); exit(3); } 20
  • 21.  Παράδειγμα 6: sender.c for (i = 1; i < argc; i++) { strcpy(buffer, argv[i]); if ((n = write(fd, buffer, 100)) == -1) { fprintf(stderr, "Sender: Write to fifo failed.n"); exit(4); } } return 0; } 21