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

Σχετικά έγγραφα
Εργαστήριο 7 fork(), exec(), signals

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

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

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

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

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

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

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

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

UNIX System Programming

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

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

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

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

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

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

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

Topic 4: Processes. *Ευχαριστίες στους Τάκη Σταµατόπουλο, Αλέξη ελή, και Αντώνη ελιγιαννάκη

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

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

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

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

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

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

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

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

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

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

4 η ιάλεξη: Signals UDP Sockets

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

Topic 4: Processes * K24: Systems Programming Instructor: Mema Roussopoulou

Προγραμματισμός ΙI (E)

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Επεξεργασία Αρχείων Κειµένου

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

Προγραμματισμός Διαχείρισης Συστημάτων ΙΙ

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Β' Περιόδου Θέµα 1. (α')

Περίληψη Φροντιστηρίου. Κατανεμημένα Συστήματα Ι. Το περιβάλλον DAP - Χαρακτηριστικά. Το περιβάλλον DAP Τι είναι.

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

Σήματα (Signals) Προγραμματισμός II 1

Διάλεξη 15η: Αναδρομή, μέρος 1ο

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

Ανάπτυξη και Σχεδίαση Λογισμικού

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013

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

ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ ΣΤΗΝ C

Υπολογισμός - Εντολές Επανάληψης

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

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

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

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

Σήματα (Signals) Προγραμματισμός II 1

Χρονοδρομολογητής Κυκλικής Επαναφοράς

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

Εργαστήριο Λειτουργικών Συστημάτων Ακ. Έτος Άσκηση 4. Πλήθος οπών <tab> Μέσο μέγεθος σε mb

Διάλεξη 5η: Εντολές Επανάληψης

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Λειτουργικά Συστήματα (ΗΥ321)

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

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Προγραμματισμός Ι (ΗΥ120)

είκτες και Πίνακες (2)

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

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

Προγραμματισμός Ι (ΗΥ120)

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

Ενδεικτικές λύσεις και στατιστικά

Σήματα (Signals) Προγραμματισμός II 1

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

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

Εργαστήριο 9: Αρχεία

Γλώσσα Προγραμματισμού C

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

Transcript:

Εργαστήριο 5 fork(), exec(), signals Στο εργαστήριο θα μελετηθούν: Παραδείγματα χρήσης των συναρτήσεων fork και exec Συνάρτηση waitpid Συνάρτηση WIFEXITED Συνάρτηση WEXITSTATUS Παράδειγμα χρήσης σημάτων Διδάσκων: Γιώργος Χατζηπολλάς Week 7-1

Η συνάρτηση waitpid() int wait (int *status) Προκαλεί την αναμονή μιας διεργασίας μέχρι κάποιο παιδί της τερματίσει -1 αν η διεργασία δεν έχει παιδιά int waitpid (pid_t pid, int*status, intoptions ) Προκαλεί την αναμονή μιας διεργασίας μέχρι το παιδί της που καθορίζεται από το pid να τερματίσει pid = -1 (ή WAIT_ANY) σημάνει ότι περιμένουμε πληροφορία για οποιοδήποτε παιδί ίνεται η δυνατότητα καθορισμού επιπλέον επιλογών. Η πιο συνηθισμένη επιλογή είναι η WNOHANG, η οποία εμποδίζει την waitpid να γίνει blocked αν δεν υπάρχουν τερματιζόμενα παιδιά To status μπορεί να τύχει επεξεργασίας με τα ακόλουθα macros τα οποία βρίσκονται στην βιβλιοθήκη wait.h WIFEXITED(status) : Εάν δεν επιστρέψει 0 τότε το παιδί έχει τερματιστεί φυσιολογικά WEXITSTATUS(status): Επιστρέφει τον κωδικό εξόδου (exit status) της διαδικασίας παιδί. Αυτό μπορεί να υπολογιστεί μόνο στην περίπτωση που η WIFEXITED επιστρέψει μημηδέν WIFSIGNALED(status): Επιστρέφει κατά πόσο η διαδικασία παιδί έχει τερματίσει μη φυσιολογικά (λόγω κάποιου σήματος) ή επιστρέφει 0 WTERMSIG(status): Επιστρέφει το σήμα το οποίο ανάγκασε τη διαδικασία παιδί να τερματίσει. Αυτό μπορεί να υπολογιστεί μόνο στην περίπτωση που η WIFSIGNALED επιστρέψει μη-μηδέν Week 7-2

Παράδειγμα 1: Χρήση fork() void fork1() { pid_t pid[n]; int i, child_status; for (i = 0; i < N; i++) if ((pid[i] = fork()) == 0) { sleep(20-2*i); exit(100+i); for (i = 0; i < N; i++) { pid_t wpid = waitpid(pid[i], wait(&child_status); &child_status, 0); if (WIFEXITED(child_status)) printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status)); else printf("child %d terminate abnormally\n", wpid); Συγχρονισμός με πολλά παιδιά Επεξεργασία των παιδιών σε τυχαία σειρά Χρήση της WIFEXITED και της WEXITSTATUS για να πάρουμε τις πληροφορίες από τα παιδιά Week 7-3

Παράδειγμα 2: Χρήση fork() Week 7-4

Παράδειγμα 2 Παράδειγμα Εκτέλεσης [hpollas@cs4090 epl428]$ tree 3 I am process no 1 with PID 11539 and PPID 9005 I am process no 2 with PID 11540 and PPID 11539 I am process no 4 with PID 11541 and PPID 11540 I am process no 5 with PID 11544 and PPID 11540 I am process no 3 with PID 11547 and PPID 11539 I am process no 6 with PID 11548 and PPID 11547 I am process no 7 with PID 11551 and PPID 11547 [hpollas@cs4090 epl428]$ [hpollas@cs4090 epl428]$ tree 4 I am process no 1 with PID 11486 and PPID 9005 I am process no 2 with PID 11487 and PPID 11486 I am process no 4 with PID 11488 and PPID 11487 I am process no 8 with PID 11489 and PPID 11488 I am process no 3 with PID 11491 and PPID 11486 I am process no 6 with PID 11493 and PPID 11491 I am process no 12 with PID 11494 and PPID 11493 I am process no 9 with PID 11495 and PPID 11488 I am process no 13 with PID 11501 and PPID 11493 I am process no 5 with PID 11500 and PPID 11487 I am process no 10 with PID 11502 and PPID 11500 I am process no 7 with PID 11504 and PPID 11491 I am process no 14 with PID 11506 and PPID 11504 I am process no 11 with PID 11509 and PPID 11500 I am process no 15 with PID 11511 and PPID 11504 [hpollas@cs4090 epl428]$ Πρόγραμμα το οποίο δημιουργεί ένα δυαδικό δέντρο από διεργασίες το οποίο έχει δεδομένο βάθος Ν. Κάθε διεργασία του δέντρου εκτυπώνει την ταυτότητά της, του πατέρα της καθώς και ένα αύξοντα αριθμό σύμφωνα με μία κατά πλάτος διάσχιση του δέντρου Week 7-5

Αποστολή/Παραλαβή Σημάτων Άσκηση 1 #include <stdio.h> /* For printf */ #include <stdlib.h> /* For exit */ #include <unistd.h> /* For execvp */ #include <signal.h> /* For SIGALRM, SIGKILL */ int pid; void onalarm(int); void onalarm(int sig) { kill(pid, SIGKILL); Week 7-6

Αποστολή/Παραλαβή Σημάτων Άσκηση 1 main(int argc, char *argv[]) { int sec = 10, status; char *progname; progname = argv[0]; if (argc > 1 && *argv[1] == '-') { sec = atoi(argv[1]+1); argc--; argv++; if (argc < 2) { printf("usage: %s [-10] command\n", progname); exit(1); if ((pid = fork()) < 0) { perror("fork"); exit(1); if (pid == 0) { execvp(argv[1], &argv[1]); perror("execvp"); exit(1); signal(sigalrm, onalarm); alarm(sec); wait(&status); if ((status & 0377) == 0) { // if (WIFEXITED(status)) { printf("command execution finished"); printf(" with exit code %d\n", status >> 8); // WEXITSTATUS(status)) else printf("command was killed by signal %d\n", status & 0177); // WTERMSIG(status) Week 7-7

Αποστολή/Παραλαβή Σημάτων Άσκηση 1 Παράδειγμα Εκτέλεσης $./timeout Usage:./timeout [-10] command $./timeout -30 Usage:./timeout [-10] command $./timeout blabla execvp: No such file or directory Command execution finished with exit code 1 $./timeout -20 ps PID TTY TIME CMD 12947 pts/0 00:00:00 bash 13026 pts/0 00:00:00 timeout 13027 pts/0 00:00:00 ps Command execution finished with exit code 0 $ date ;./timeout -12 sleep 15 ; date Mon Feb 18 18:43:20 EET 2002 Command was killed by signal 9 Mon Feb 18 18:43:32 EET 2002 $ date ;./timeout sleep 7 ; date Mon Feb 18 18:43:49 EET 2002 Command execution finished with exit code 0 Mon Feb 18 18:43:56 EET 2002 $ Week 7-8

int loop; void sigusr1_handler(int); Αποστολή/Παραλαβή Σημάτων Άσκηση 2 main() { int pid; signal(sigusr1, sigusr1_handler); while(1) { printf("i am process %d and I am going to loop\n", getpid()); loop = 1; while(loop) { sleep(1); if ((pid = fork()) == -1) { perror("fork"); exit(1); if (pid == 0) continue; else exit(0); void sigusr1_handler(int sig) { printf("sigusr1 (= %d) received\n", sig); loop = 0; Week 7-9

ιαχείριση ιεργασιών Παράδειγμα Εκτέλεσης $./persistent & [1] 13059 I am process 13059 and I am going to loop $ kill -USR1 13059 SIGUSR1 (= 10) received I am process 13060 and I am going to loop [1]+ Done./persistent $ kill -USR1 13060 $ SIGUSR1 (= 10) received I am process 13061 and I am going to loop kill -USR1 13061 SIGUSR1 (= 10) received $ I am process 13062 and I am going to loop kill -USR1 13062 $ SIGUSR1 (= 10) received I am process 13063 and I am going to loop kill -KILL 13063 $ Week 7-10