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

Σχετικά έγγραφα
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαδιεργασιακή Επικοινωνία Εργαστηριακές Ασκήσεις

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαδιεργασιακή Επικοινωνία

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

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

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

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

Εργαστήριο 5 fork(), exec(), signals

Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4. Λειτουργικά Συστήματα- Φροντιστήριο 2

Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος

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

NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ ΜΑΘΗΜΑ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

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

Προγραμματισμός συστημάτων UNIX/POSIX. Σήματα (signals)

ΝΗΜΑΤΑ - ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαδιεργασιακή Επικοινωνία

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

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

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

UNIX System Programming

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

Εργαστήριο 7 fork(), exec(), signals

i M-1 1. ij f(i, j) N-1. (pixel) 2. M N (x, y) (x, y ) = 256. R(x, y), G(x, y), B(x, y)

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

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

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

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

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

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

CSLab National Technical University of Athens

Παράλληλη Επεξεργασία

C: Από τη Θεωρία στην Εφαρμογή

ή α α POSIX Threads ( έ ος 1 ο )

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

Αρχές Προγραμματισμού

Παρουσίαση 5 ης Άσκησης:

Φροντιςτήριο. Linked-List

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Hancock. Ζωγραφάκης Ιωάννης Εξαρχάκος Νικόλαος. ΕΠΛ 428 Προγραμματισμός Συστημάτων

Παρουσίαση 5 ης Άσκησης:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Αδιέξοδα Εργαστηριακές Ασκήσεις

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

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

The Simply Typed Lambda Calculus

Διάλεξη 14: Διεργασίες: Έλεγχος & Σήματα (Processes: Control & Signals)

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

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads)

Ο πιο κάτω πίνακας περιγράφει σε ποιες περιπτώσεις χρησιμοποιούμε τους τρεις πιο πάνω τρόπους:

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Σημειώσεις έκτης και έβδομης εβδομάδας

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

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

HOMEWORK 4 = G. In order to plot the stress versus the stretch we define a normalized stretch:

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

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

derivation of the Laplacian from rectangular to spherical coordinates

Εργαστήριο 9. Styling with Javascript

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Physical DB Design. B-Trees Index files can become quite large for large main files Indices on index files are possible.

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Κατανεμημένα Συστήματα. Javascript LCR example

Διάλεξη 10η: Πολυδιάστατοι Πίνακες

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

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

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

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

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

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

SCHOOL OF MATHEMATICAL SCIENCES G11LMA Linear Mathematics Examination Solutions

Εργαστήριο Λειτουργικών Συστημάτων. Inside System Calls

Οδηγίες Αγοράς Ηλεκτρονικού Βιβλίου Instructions for Buying an ebook

The challenges of non-stable predicates

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Συµβολοσειρές - Strings

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Προσομοίωση BP με το Bizagi Modeler

2 Composition. Invertible Mappings

Transcript:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Διαδιεργασιακή Επικοινωνία Εργαστηριακές Ασκήσεις Υλικό από: Modern Operating Systems Laboratory Exercises, Shrivakan Mishra Σύνθεση Κ.Γ. Μαργαρίτης, Τμήμα Εφαρμοσμένης Πληροφορικής, Πανεπιστήμιο Μακεδονίας Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639

1. Εκτελέστε τα προγράμματα με signals στις σελίδες 3 6. Τροποποιείστε τα προγράμματα: 1.1 Η γονική διεργασία μέσα στο while loop εκτελεί κάποια λειτουργία, πχ sleep(100) ή getchar(). Τι θα συμβεί όταν έρθει το σήμα τερματισμού της θυγατρικής διεργασίας; 1.2 Αλλαξτε τη σειρά των συναρτήσεων και τη θέση του for μέσα στο κώδικα της θυγατρικής διεργασίας. Αλλάζει κατι στην εκτέλεση; Κανετε την επικοινωνια με σήματα αμφιδρομη. 2. Υλοποιείστε τις συναρτήσεις που λείπουν από το πρόγραμμα της σελίδας 7. 3. Τα προγράμματα των σελίδων 8 12 λύνουν το πρόβλημα παραγωγού-καταναλωτή με διαφορετικές τεχνικές. Συγκρίνετε τα προγράμματα και τους μηχανισμούς IPC που χρησιμοποιούν. Προκαλέστε μεγάλες καθυστερήσεις σε παραγωγό ή καταναλωτή για να δείτε τι θα συμβεί. Τροποποιείστε τα προγράμματα ώστε η παραγωγή και η κατανάλωση να γίνεται σε ζεύγη δεδομένων (δηλ παραγωγή 2 δεδομένων, κατανάλωση 2 δεδομένων κοκ) 4. Συμπληρώστε το πρόγραμμα'πολλαπλών παραγωγών καταναλωτών στις σελίδες 13 15 με βάση τους μηχανισμούς IPC των σελίδων 8 12. 5.Τροποιείστε το πρόγραμμα στις σελίδες 16-17 όπως στα ερωτήματα 3 και 4. 6. Στις σελίδες 18 19 φαίνονται δύο εκδοχές δημιουργίας διοχέτευσης. Υλοποιείστε το πρώτο πρόγραμμα με τη λογική του δευτέρου και αντίστροφα.

#include <signal.h> #include <stdio.h> #include <stdlib.h> /* When a SIGINT signal arrives, set this variable. */ int usr_interrupt = 0; void synch_signal (int sig) usr_interrupt = 1; /* The child process executes this function. */ void child_function (void) /* Perform initialization. */ printf ("I'm here!!! My pid is %d.\n", (int) getpid ()); /* Let parent know you're done. */ kill (getppid (), SIGINT); /* Continue with execution. */ printf ("Bye, now...\n"); exit (0);

int main (void) pid_t child_id; /* Establish the signal handler. */ signal (SIGINT, synch_signal); /* Create the child process. */ child_id = fork(); if (child_id == 0) child_function (); /* Does not return. */ /* Busy wait for the child to send a signal. */ while (!usr_interrupt) ; /* Now continue execution. */ printf ("That's all, folks!\n"); return 0;

/* sig_talk.c --- Example of how 2 processes can talk */ /* to each other using kill() and signal() */ /* We will fork() 2 process and let the parent send a few */ /* signals to it`s child */ #include <stdio.h> #unclude <stdlib.h> #include <signal.h> void sighup(); /* routines child will call upon sigtrap */ void sigint(); void sigquit(); main() int pid; /* get child process */ if ((pid = fork()) < 0) /* unsuccesful fork */ perror("fork"); exit(1); if (pid == 0) /* child */ signal(sighup,sighup); /* set function calls */ signal(sigint,sigint); signal(sigquit, sigquit); for(;;); /* loop for ever */

else /* parent */ /* pid hold id of child */ printf("\nparent: sending SIGHUP\n\n"); kill(pid,sighup); sleep(3); /* pause for 3 secs */ printf("\nparent: sending SIGINT\n\n"); kill(pid,sigint); sleep(3); /* pause for 3 secs */ printf("\nparent: sending SIGQUIT\n\n"); kill(pid,sigquit); sleep(3); void sighup() signal(sighup,sighup); /* reset signal */ printf("child: I have received a SIGHUP\n"); void sigint() signal(sigint,sigint); /* reset signal */ printf("child: I have received a SIGINT\n"); void sigquit() printf("my DADDY has Killed me!!!\n"); exit(0);

Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639

#include <pthread.h> #include <stdio.h> #include <semaphore.h> #define BUFF_SIZE 4 #define SHARED 1 char buffer[buff_size]; int nextin = 0; int nextout = 0; sem_t empty_slots; sem_t full_slots; void Put(char item) sem_wait(&empty_slots); buffer[nextin] = item; nextin = (nextin + 1) % BUFF_SIZE; printf("producing %c...\n", item); sem_post(&full_slots); void * Producer() int i; for(i = 0; i < 10; i++) Put((char)('A'+ i % 26)); void Get() int item; sem_wait(&full_slots); item = buffer[nextout]; nextout = (nextout + 1) % BUFF_SIZE; printf("consuming %c...\n", item); sem_post(&empty_slots); void * Consumer() main() int i; for(i = 0; i < 10; i++) Get(); pthread_t tid1, tid2; sem_init(&empty_slots, SHARED, 4); sem_init(&full_slots, SHARED, 0); pthread_create(&tid1, NULL, Producer, NULL); pthread_create(&tid2, NULL, Consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL);

/* Producer/consumer program illustrating conditional variables */ #include<pthread.h> #include <stdio.h> #define BUF_SIZE 3 /* Size of shared buffer */ int buffer[buf_size]; /* shared buffer */ int add=0; /* place to add next element */ int rem=0; /* place to remove next element */ int num=0; /* number elements in buffer */ pthread_mutex_t m=pthread_mutex_initializer ; /* mutex lock for buffer */ pthread_cond_t c_cons=pthread_cond_initializer; /* consumer waits on this cond var */ pthread_cond_t c_prod=pthread_cond_initializer; /* producer waits on this cond var */ void *producer(void *param); void *consumer(void *param); main (int argc, char *argv[]) pthread_t tid1, tid2; /* thread identifiers */ int i; /* create the threads; may be any number, in general */ if (pthread_create(&tid1,null,producer,null)!= 0) fprintf (stderr, "Unable to create producer thread\n"); exit (1); if (pthread_create(&tid2,null,consumer,null)!= 0) fprintf (stderr, "Unable to create consumer thread\n"); exit (1); /* wait for created thread to exit */ pthread_join(tid1,null); pthread_join(tid2,null); printf ("Parent quiting\n");

/* Produce value(s) */ void *producer(void *param) int i; for (i=1; i<=20; i++) /* Insert into buffer */ pthread_mutex_lock (&m); if (num > BUF_SIZE) exit(1); /* overflow */ while (num == BUF_SIZE) /* block if buffer is full */ pthread_cond_wait (&c_prod, &m); /* if executing here, buffer not full so add element */ buffer[add] = i; add = (add+1) % BUF_SIZE; num++; pthread_mutex_unlock (&m); pthread_cond_signal (&c_cons); printf ("producer: inserted %d\n", i); fflush (stdout); printf ("producer quiting\n"); fflush (stdout); /* Consume value(s); Note the consumer never terminates */ void *consumer(void *param) int i; while (1) pthread_mutex_lock (&m); if (num < 0) exit(1); /* underflow */ while (num == 0) /* block if buffer empty */ pthread_cond_wait (&c_cons, &m); /* if executing here, buffer not empty so remove element */ i = buffer[rem]; rem = (rem+1) % BUF_SIZE; num--; pthread_mutex_unlock (&m); pthread_cond_signal (&c_prod); printf ("Consume value %d\n", i); fflush(stdout);

#include <stdio.h> #include <pthread.h> pthread_mutex_t mtx; pthread_cond_t cond; int how_many = 10; int pool = 0; void * producer(void * ptr) while (how_many > 0) pthread_mutex_lock(&mtx); printf("producer: %d\n", how_many); pool = how_many; how_many ; pthread_mutex_unlock(&mtx); pthread_cond_signal(&cond); pthread_exit(0);

void * consumer(void * ptr) while (how_many > 0) pthread_mutex_lock(&mtx); pthread_cond_wait(&cond, &mtx); printf("consumer: %d\n", pool); pool = 0; pthread_mutex_unlock(&mtx); pthread_exit(0); int main(int argc, char ** argv) pthread_t prod, cons; pthread_mutex_init(&mtx, 0); pthread_cond_init(&cond, 0); pthread_create(&cons, 0, consumer, 0); pthread_create(&prod, 0, producer, 0); pthread_join(prod, 0); pthread_join(cons, 0); pthread_cond_destroy(&cond); pthread_mutex_destroy(&mtx); return 0;

#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #define BUFF_SIZE 5 /* total number of slots */ #define NP 3 /* total number of producers */ #define NC 3 /* total number of consumers */ #define NITERS 4 /* number of items produced/consumed */ typedef struct int buf[buff_size]; /* shared var */ int in; /* buf[in%buff_size] is the first empty slot */ int out; /* buf[out%buff_size] is the first full slot */ sem_t full; /* keep track of the number of full spots */ sem_t empty; /* keep track of the number of empty spots */ sem_t mutex; /* enforce mutual exclusion to shared data */ sbuf_t; sbuf_t shared;

void *Producer(void *arg) int i, item, index; index = (int)arg; for (i=0; i < NITERS; i++) /* Produce item */ item = i; printf("[p%d] Producing %d...\n", index, item); fflush(stdout); /* Write item to buf */ /* If there are no empty slots, wait */ sem_wait(&shared.empty); /* If another thread uses the buffer, wait */ sem_wait(&shared.mutex); shared.buf[shared.in] = item; shared.in = (shared.in+1)%buff_size; /* Release the buffer */ sem_post(&shared.mutex); /* Increment the number of full slots */ sem_post(&shared.full); /* Interleave producer and consumer execution */ if (i % 2 == 1) sleep(1); return NULL;

void *Consumer(void *arg) /* Fill in the code here */ int main() pthread_t idp, idc; int index; sem_init(&shared.full, 0, 0); sem_init(&shared.empty, 0, BUFF_SIZE); /* Insert code here to initialize mutex*/ for (index = 0; index < NP; index++) /* Create a new producer */ pthread_create(&idp, NULL, Producer, (void*)index); /* Insert code here to create NC consumers */ pthread_exit(null);

#include <pthread.h> #include <mqueue.h> int main(void) mqd_t messagequeuedescr; /* Create the message queue for sending information between tasks. */ messagequeuedescr = mq_open(messagequeuepath, (O_CREAT O_EXCL O_RDWR)); /* Create the producer task using the default task attributes. Do not * pass in any parameters to the task. */ pthread_create(&producertaskobj, NULL, (void *)producertask, NULL); /* Create the consumer task using the default task attributes. Do not * pass in any parameters to the task. */ pthread_create(&consumertaskobj, NULL, (void *)consumertask, NULL); /* Allow the tasks to run. */ pthread_join(producertaskobj, NULL); pthread_join(consumertaskobj, NULL); return 0; Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639

void producertask(void *param) mqd_t messagequeuedescr; msgbuf_t msg; messagequeuedescr = mq_open(messagequeuepath, O_WRONLY); while (1) /* Create message msg */ /* Send message */ mq_send(messagequeuedescr, &msg.buf, sizeof(msgbuf_t), 0); void consumertask(void *param) mqd_t messagequeuedescr; msgbuf_t rcvmsg; messagequeuedescr = mq_open(messagequeuepath, O_RDONLY); while (1) /* Wait for a new message. */ mq_receive(messagequeuedescr, &rcvmsg.buf, sizeof(msgbuf_t), NULL); /* Cosnume message msg */ Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639

#include <stdio.h> #include <stdlib.h> void write_data (FILE * stream) int i; for (i = 0; i < 100; i++) fprintf (stream, "%d\n", i); if (ferror (stream)) fprintf (stderr, "Output to stream failed.\n"); exit (EXIT_FAILURE); int main (void) FILE *output; output = popen ("more", "w"); if (!output) fprintf (stderr,"incorrect parameters or too many files.\n"); return EXIT_FAILURE; write_data (output); if (pclose (output)!= 0) fprintf (stderr,"could not run more or other error.\n"); return EXIT_SUCCESS;

#include <stdio.h> #include <string.h> #include <sys/wait.h> int main(int argc, char *argv[]) int p[2]; int i, pid, status; char buffer[20]; pipe(p); /* setting up the pipe */ if ((pid = fork()) == 0) /* in child */ close(p[1]); /* child closes p[1] */ while ((i = read(p[0], buffer, 8))!= 0) buffer[i] = '\0'; /* string terminator */ printf("%d chars :%s: received by child\n", i, buffer); close(p[0]); exit(0); /* child terminates */ /* in parent */ close(p[0]); /* parent writes p[1] */ write(p[1], "Hello there, from me?", sizeof("hello there, from me?")); write(p[1], "How are you? - Ercal", sizeof("how are you? - Ercal")); close(p[1]); /* finished writing p[1] */ while (wait(&status)!=pid); /* waiting for pid */ if (status == 0) printf("child finished\n"); else printf("child failed\n"); return(0);