ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διαφάνειες παρουσίασης #10 4 Ροές δεδομένων εισόδου / εξόδου στη C++ 4 Διεργασίες στο Unix 4 Προγραμματισμός διεργασιών
2Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Ροές εισόδου / εξόδου(iii) u Έλεγχος σφαλμάτων eof, bad, fail, good, clear u Μορφή εισόδου / εξόδου width μήκος εκτύπωσης fill χαρακτήρας γεμίσματος precision ακρίβεια δεκαδικών αριθμών setf άλλες παράμετροι εκτύπωσης l σύστημα αρίθμησης (δεκαδικό, κ.λπ.) l δεκαδικοί αριθμοί με μορφή εκθέτη l στοίχιση εκτύπωσης (αριστερά, δεξιά, κ.λπ) l εξαγωγή κενών χαρακτήρων
3Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Ροές εισόδου / εξόδου(iv) u Παράδειγμα #include int main () { cout.width(10); cout.fill('#'); cout.setf(ios::hex, ios::basefield); cout.setf(ios::uppercase); cout << 3241 << endl; return 0; } #######CA9
4Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Ροές εισόδου / εξόδου(v) u Manipulators endl, flush setw, setbase, setfill, setprecision setiosflags, resetiosflags u Παράδειγμα cout << setw(10) << setfill('#') << setbase(16) << setiosflags(ios::uppercase) << 3241 << endl;
5Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Υλοποίηση εισόδου / εξόδου(i) u Παράδειγμα class complex { //... friend ostream operator << ( ostream & s, const complex & c); friend istream operator >> ( istream & s, complex & c); }; complex c; cin >> c; cout << c;
6Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Υλοποίηση εισόδου / εξόδου(ii) u Παράδειγμα ostream operator << (ostream & s, const complex & c) { s << c.re; if (c.im > 0) s << "+j" << c.im; else if (c.im < 0) s << "-j" << fabs(c.im); return s; }
7Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Ροές αρχείων εισόδου / εξόδου #include int main () { ifstream fin ("source.txt"); ofstream fout ("target.txt"); if (!fin || !fout) { cerr << "Cannot open files!\n"; return 1; } char c; while (fout && fin.get(c)) fout.put(c); return 0; }
8Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διεργασίες στο Unix(i) u Διεργασία (process): ένα πρόγραμμα που εκτελείται σε ένα σύστημα Unix u Το Unix υποστηρίζει την ταυτόχρονη εκτέλεση περισσότερων διεργασιών u Με τον τρόπο αυτό υποστηρίζονται: l πολλοί χρήστες (multi-user) l πολλές εργασίες (multi-tasking) u Μια διεργασία μπορεί να δημιουργήσει άλλες διεργασίες l Διεργασία παιδί (child process) l Διεργασία γονέας (parent process)
9Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διεργασίες στο Unix(ii) u Χαρακτηριστικά διεργασιών: l κωδικός διεργασίας (process ID) l κωδικός διεργασίας γονέα (parent process ID) l πραγματικός κωδικός χρήστη και ομάδας (real user ID, real group ID) l ισχύων κωδικός χρήστη και ομάδας (effective user ID, effective group ID) u Κάθε διεργασία έχει δικό της: l χώρο αποθήκευσης μεταβλητών l στοίβα εκτέλεσης l ανοιχτά αρχεία l άλλες παραμέτρους εκτέλεσης
10Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διεργασία παιδί int x3 Διεργασίες στο Unix(iii) u Δημιουργία νέας διεργασίας l Αμέσως μετά τη δημιουργία νέας διεργασίας, οι τιμές των μεταβλητών της διεργασίας παιδιού και της διεργασίας γονέα συμπίπτουν l Αργότερα όμως, μπορούν να μεταβάλλονται ανεξάρτητα Διεργασία γονέας int x3 5
11Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Προγραμματισμός διεργασιών(i) u Δημιουργία νέας διεργασίας pid_t fork (); u Πληροφορίες σχετικά με διεργασίες pid_t getpid (); pid_t getppid (); gid_t getgid (); uid_t getuid (); gid_t getegid (); uid_t geteuid (); u Πρόωρος τερματισμός διεργασίας void _exit (int status); void exit (int status);
12Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Προγραμματισμός διεργασιών(ii) #include int main () { pid_t i = fork(); if (i == 0) cout << "Child: PID=" << getpid() << ", PPID=" << getppid() << endl; else cout << "Parent: PID=" << getpid() << ", PPID=" << getppid() << endl; return 0; }
13Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Προγραμματισμός διεργασιών(iii) u Αναμονή τερματισμού διεργασίας pid_t wait (int * status); pid_t waitpid (pid_t i, int * status, int options); u Εκτέλεση προγραμμάτων int execl (const char * path, const char * arg0,...); int execv (const char * path, char * const argv[]); int system (const char * cmd); Αναζήτηση εκτελέσιμων στο τρέχον μονοπάτι αναζήτησης ( $PATH ): execp, execvp