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



Process Management and Signal Handling

Στην πρώτη αυτή εισαγωγική άσκηση των λειτουργικών συστημάτων σας ζητείται να υλοποιήσετε ένα απλό πρόγραμμα που θα σας βοηθήσει να
εξοικειωθείτε με βασικές έννοιες από το χώρο των processes και των signals.  Τα signals ουσιαστικά είναι interrupts σε επίπεδο software και στην άσκηση καλείστε να τα χρησιμοποιήσετε για επικοινωνία ανάμεσα σε 2 διεργασίες.

 

Αρχικά το πρόγραμμα σας θα πρέπει να κάνει χρήση του system call fork για να δημιουργήσει μια νέα διεργασία. Μετά την δημιουργία της νέας διεργασίας (child process), η πατρική διεργασία θα πρέπει να ανοίξει ένα αρχείο για εγγραφή (π.χ. pid_log.txt), και να καταχωρήσει μια ένδειξη οτι είναι η πατρική διεργασία καθώς και τον αριθμό διεργασίας της (process id).  Στην συνέχεια θα πρέπει να ενημερώσει την θυγατρική διεργασία οτι μπορει να ξεκινήσει εκείνη την λειτουργία της, ενώ η πατρική διεργασία θα μπεί σε κατάσταση αναμονής.

Αυτή η επικοινωνία θα γίνει μέσω signal.

 

Την στιγμή που θα ξεκινήσει να εκτελείται η νέα διεργασία (child process) θα πρέπει να κάνει χρήση της εντολής pause() και να περιμένει έως ότου λάβει ένα signal απο την πατρική διεργασία.  Μετά που λάβει το αρχικό signal, θα ανοίξει το ίδιο αρχείο (π.χ. pid_log.txt) και παρόμοια θα καταγράψει ότι είναι η θυγατρική διεργασία και τον αριθμό διεργασίας της. Μετά θα περιμένει ομοίως 2 δευτερόλεπτα και θα στείλει signal στην πατρική διεργασία ότι μπορεί να συνεχίσει. Τότε,  η πατρική δειργασία θα επαναλάβει την ίδια συμπεριφορά: θα γράψει στο αρχείο, θα περιμένει 2 δευτερόλεπτα, θα στείλει signal στην θυγατρική και θα μπεί σε κατάσταση αναμονής.

 

Το πρόγραμμα σας θα επαναλαμβάνει επ’άπειρον αυτή την συμπεριφορά, και θα περιμένει signal απο τον χρήστη για να τερματίσει την λειτουργία του.

Συγκεκριμένα, θα πρέπει ο χρήστης να πατήσει CTRL-C για να τερματίσει το πρόγραμμα.

Μόλις λάβει αυτό το signal η πατρική διεργασία, θα στείλει signal στην θυγατρική διεργασία που θα δίνει εντολή για τερματισμό. Μετά που τερματίσει

η θυγατρική διεργασία, θα τερματίσει και η πατρική.


Θα πρέπει το πρόγραμμα σας σε κάθε βήμα να τυπώνει ενημερωτικό μήνυμα σχετικά με τις ενέργειες που διεξάγει κάθε διεργασία (και ποιά διεργασία ειναι),  πότε στέλνει ή δέχεται κάποιο signal, καθώς και το είδος του signal.

 

Sample logfile

                                                                                                                                                              

parent starting: pid 1234

child starting: pid 5678

parent (1234)

child (5678)

parent (1234)

child (5678)

...

[ctrl-c] received

child exiting

parent exiting

 

 

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σκηση 1

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

 fork(2), exec(2), kill(2), pause(3), signal(3), wait(2), getpid(2)
 

Κάποιες από τις βιβλιοθήκες που θα πρέπει να χρησιμοποιήσετε είναι οι παρακάτω:
#include <stdlib.h> 
#include <unistd.h>
#include <signal.h>

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

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