Λειτουργικά Συστήματα (ΗΥ-345)
Χειμερινό Εξάμηνο 2012
Ασκηση 2η



InterProcess communication (IPC) - sockets/pipes

Στην δεύτερη άσκηση των λειτουργικών συστημάτων σας ζητείται να υλοποιήσετε ορισμένα προγράμματα τα οποία θα σας βοηθήσουν να εξοικειωθείτε με βασικές έννοιες από το χώρο του IPC (InterProcess Communication), των μεθόδων δηλαδή για την ανταλλαγή δεδομένων μεταξύ των διεργασιών. Τα εργαλεία που θα χρησιμοποιήσετε είναι named pipes και sockets.

Ζητούμενο τις άσκησης είναι να δημιουργήσετε ένα echo server. Μία διεργασία δηλαδή που θα δέχεται μηνύματα από αλλες διεργασίες και θα τα αναπαράγει. Η υλοποίησή σας θα αποτελείται από 2 προγράμματα όπου το ένα θα υλοποιεί τον server και το αλλό τον client ο οποίος θα στέλνει τα μηνύματα στον server. Επίσης ζητούμενο είναι να υπάρχουν 2 εκδοχές. Στην πρώτη και οι 2 διεργασίες θα τρέχουν στο ίδιο μηχάνημα και στη δεύτερη ο server και ο client θα τρέχουν σε διαφορετικά μηχανήματα.

Εκδοχή 1 - κοινό μηχάνημα

To εργαλείo που θα χρησιμοποιήσετε σε αυτή τη περίπτωση είναι τα named pipes. Όταν χρησιμοποιούμε pipes ένα σύνολο από διεργασίες συνδέονται μέσων των standard streams τους, έτσι ώστε το output stream μιας διεργασίας να τροφοδοτεί το input steam μίας άλλης.
Αρχικά ο server θα χρησιμοποιεί το system call mkfifo ώστε να δημιουργήσει ένα named pipe. Το pipe είναι ένα special file που θα χρησιμοποιεί ο client για να τροφοδοτήσει με μηνύματα τον server ο οποίος στη συνέχεια θα τα αναπαράγει. Για να χρησιμοποιηθεί το pipe από τις διεργασίες θα πρέπει να το ανοίξουν όπως ένα αρχείο, και να γίνουν τα κατάλληλα system calls read και write.

Εκδοχή 2 - διαφορετικά μηχανήματα

Σε αυτή τη περίπτωση ο server και ο client θα βρίσκονται σε διαφορετικά μηχανήματα και το IPC θα πραγμτατοποιήται με sockets. Ο server θα χρησιμοποιεί το system call socket για να δημιουργήσει ενα stream socket και θα δέχεται connections από client διεργασίες που θα τρέχουν σε άλλο μηχάνημα.
Για την επικοινωνία μεταξύ των διεργασιών από την πλευρά του server θα πρέπει να χρησιμοποιηθούν κατάλληλα τα system calls bind, listen και accept ωστε ο server να περιμένει και να δέχεται ένα connection στην IP του και σε ένα Port της επιλογής σας.
O client από την πλευρά του χρησιμοποιεί τα system calls socket και connect ώστε να πραγματοποιηθεί η σύνδεση με τον server.
Η επικοινωνία μεταξύ των διεργασιών θα πραγματοποιήται με τα system calls send και recv.

Και στις δύο εκδοχές τα μηνύματα θα πρέπει να είναι command line arguments στον client τα οποία θα πρέπει να στέλει στον server.

π.χ.: ./client "This is a message" ... "quit"

Όταν ο client ολοκληρώσει τα μηνύματα που είναι να στείλει θα κλείνει το pipe ή socket από την πλευρά του αλλά ο server θα πρέπει να συνεχίσει να μπορεί να δέχεται μηνύματα από επόμενες διεργασίες. Η ολοκλήρωση του server θα γίνεται όταν λάβει το μηνυμα "quit" όπου θα διαγράφει το pipe ή θα κλείνει το socket.

Reference - man pages

Ένα man page περιγράφει τον τρόπο λειτουργίας ενός προγράμματος, ενός system call ή μιας library function. Η εμφάνιση ενός man page γίνεται με τη χρήση της εντολής:

man(1)

Για να δείτε το man page (σε Linux) που αναφέρεται στη foo(N), κάνετε:

% man -S N foo

Ο συμβολισμός foo(N) αναφέρεται στο man page που περιγράφει τη foo στη κατηγορία (section) 'Ν'.

Λίστα με χρήσιμα man pages για την Aσκηση 2

Σας παραθέτουμε man pages με system calls και κάποιες συναρτήσεις που μπορεί να χρειαστείτε για την υλοποίηση της άσκησης. Η παρακάτω λίστα δεν είναι δεσμευτική. Μπορείτε να χρησιμοποιήσετε και εναλλακτικούς τρόπους.

mkfifo(3), unlink(2), socket(2), bind(2), listen(2), accept(2), connect(2), send(2), recv(2)
 
Κάποιες από τις βιβλιοθήκες που θα πρέπει να χρησιμοποιήσετε είναι οι παρακάτω:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/socket.h>

Παρατηρήσεις

  1. Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας και το λογαριασμό σας (account) σε όλα τα αρχεία.
  2. Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε πληκτρολογώντας make all να γίνεται η μεταγλώττιση (compilation) του προγράμματος και να παράγεται το εκτελέσιμο αρχείο. Επίσης πληκτρολογώντας make clean να καθαρίζονται όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται για τη μεταγλώττιση.
  3. Επιπλέον, γράψτε και ένα αρχείο readme.txt το πολύ 30 γραμμών που να περιέχει επεξηγήσεις για τον τρόπο υλοποίησης.
  4. Τοποθετήστε σε ένα κατάλογο όλα τα αρχεία που χρειάζονται για την άσκηση 2. Παραδώστε τα παραπάνω αρχεία χρησιμοποιώντας το πρόγραμμα submit (πληκτρολογήστε submit assignment_2@hy345 directory_name από τον κατάλογο που περιέχει τον κατάλογο directory_name με τα αρχέια της άσκησης).
  5. Σε πολλές περιπτώσεις τα ονόματα των συναρτήσεων βιβλιοθήκης είναι ενδεικτικά. Μπορείτε να χρησιμοποιήσετε όποια σας βολεύουν.