UNIX System Programming

Σχετικά έγγραφα
Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

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

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

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

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

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

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

Διεργασίες και Νήματα (1/2)

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

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

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

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

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

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

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

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

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

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

The Simply Typed Lambda Calculus

Διεργασίες - Σύνοψη. Διακοπές, προνομιούχος κατάσταση Κλήσεις συστήματος. Ορισμός, μεταβάσεις κατάστασης κύκλος ζωής

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

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

Περιγραφή και Έλεγχος ιεργασιών

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

HY150a Φροντιστήριο 3 24/11/2017

Instruction Execution Times

(C) 2010 Pearson Education, Inc. All rights reserved.

Capacitors - Capacitance, Charge and Potential Difference

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

Συστήματα Διαχείρισης Βάσεων Δεδομένων

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

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

Στο εστιατόριο «ToDokimasesPrinToBgaleisStonKosmo?» έξω από τους δακτυλίους του Κρόνου, οι παραγγελίες γίνονται ηλεκτρονικά.

Modbus basic setup notes for IO-Link AL1xxx Master Block

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

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

Εγκατάσταση λογισμικού και αναβάθμιση συσκευής Device software installation and software upgrade

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

ΚΥΠΡΙΑΚΟΣ ΣΥΝΔΕΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY 21 ος ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δεύτερος Γύρος - 30 Μαρτίου 2011

File Management και I/O στο UNIX

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

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

[1] P Q. Fig. 3.1

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

EE512: Error Control Coding

Section 8.3 Trigonometric Equations

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

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

Overview. Transition Semantics. Configurations and the transition relation. Executions and computation

Main source: "Discrete-time systems and computer control" by Α. ΣΚΟΔΡΑΣ ΨΗΦΙΑΚΟΣ ΕΛΕΓΧΟΣ ΔΙΑΛΕΞΗ 4 ΔΙΑΦΑΝΕΙΑ 1

2 Composition. Invertible Mappings

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

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

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

Fractional Colorings and Zykov Products of graphs

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ342: Βάσεις Δεδομένων. Χειμερινό Εξάμηνο Φροντιστήριο 10 ΛΥΣΕΙΣ. Επερωτήσεις SQL

Potential Dividers. 46 minutes. 46 marks. Page 1 of 11

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

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

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

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

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

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

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

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

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

Επιτεύγµατα των Λ.Σ.

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

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

The challenges of non-stable predicates

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

Models for Probabilistic Programs with an Adversary

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

PARTIAL NOTES for 6.1 Trigonometric Identities

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

TMA4115 Matematikk 3

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

Matrices and Determinants

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

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

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

Finite Field Problems: Solutions

CS 150 Assignment 2. Assignment 2 Overview Opening Files Arrays ( and a little bit of pointers ) Strings and Comparison Q/A

Statistical Inference I Locally most powerful tests

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

(1) Describe the process by which mercury atoms become excited in a fluorescent tube (3)

4.6 Autoregressive Moving Average Model ARMA(1,1)

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

Homework 3 Solutions

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

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

9.09. # 1. Area inside the oval limaçon r = cos θ. To graph, start with θ = 0 so r = 6. Compute dr

ΕΠΛ221: Οργάνωση Υπολογιστών και Συμβολικός Προγραμματισμός. Εργαστήριο Αρ. 2

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΜΣ «ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΛΗΡΟΦΟΡΙΚΗΣ» ΚΑΤΕΥΘΥΝΣΗ «ΕΥΦΥΕΙΣ ΤΕΧΝΟΛΟΓΙΕΣ ΕΠΙΚΟΙΝΩΝΙΑΣ ΑΝΘΡΩΠΟΥ - ΥΠΟΛΟΓΙΣΤΗ»

Fourier Series. MATH 211, Calculus II. J. Robert Buchanan. Spring Department of Mathematics

Transcript:

UNIX System Programming Processes Objectives look at how to program UNIX processes fork( ), wait( )

Overview 1. What is a Process? 2. fork() 3. wait() 4. Process Data

1. What is a Process? A process is the context (the information/data) maintained for an executing program. Intuitively, a process is the abstraction of a physical processor. Exists because it is difficult for the OS to otherwise coordinate many concurrent activities, such as incoming network data, multiple users, etc. IMPORTANT: A process is sequential

What makes up a Process? program code machine registers global data stack open files (file descriptors) an environment (environment variables; credentials for security)

Some of the Context Information Process ID (pid) Parent process ID (ppid) Real User ID which this process Effective User ID unique integer ID of user/process started ID of user who wrote the process program continued

Important System Processes init Mother of all processes. init is started at boot time and is responsible for starting other processes. init uses file inittab & directories: /etc/rc?.d getty login process that manages login sessions.

Unix Start Up Processes Diagram OS kernel Process 0 (sched) Process 1 (init) getty getty getty login login csh bash

Pid and Parentage A process ID or pid is a positive integer that uniquely identifies a running process, and is stored in a variable of type pid_t. You can get the process pid or parent s pid #include <sys/types> main() { pid_t pid, ppid; printf( "My PID is:%d\n\n",(pid = getpid()) ); printf( "Par PID is:%d\n\n",(ppid = getppid()) );

2. fork() #include <sys/types.h> #include <unistd.h> pid_t fork( void ); Creates a child process by making a copy of the parent process --- an exact duplicate. Implicitly specifies code, registers, stack, data, files Both the child and the parent continue running.

fork() as a diagram Parent pid = fork() Returns a new PID: e.g. pid == 5 Data Shared Program Child pid == 0 Data Copied

Process IDs (pids revisited) pid = fork(); In the child: pid == 0; In the parent: pid == the process ID of the child. A program almost always uses this pid difference to do different things in the parent and child.

fork() Example (parchld.c) #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t pid; /* could be int */ int i; pid = fork(); if( pid > 0 ) { /* parent */ for( i=0; i < 1000; i++ ) printf( \t\t\tparent %d\n, i);

else { /* child */ for( i=0; I < 1000; i++ ) printf( CHILD %d\n, i ); return 0;

Possible Output CHILD 0 CHILD 1 CHILD 2 CHILD 3 CHILD 4 : PARENT 0 PARENT 1 PARENT 2 PARENT 3 PARENT 4

Things to Note i is copied between parent and child. The switching between the parent and child depends on many factors: machine load, system process scheduling I/O buffering effects amount of output shown. Output interleaving is nondeterministic cannot determine output by looking at code

3. wait() #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *statloc); Suspends the calling process until one of its child processes ends. If the system already has information about a terminated child process when wait is called, the return from wait occurs immediately. Status information for the terminating child process is usually stored at the location pointed to by *statloc. if wait is called with NULL as the *statloc value, no status information is returned. If successful, wait returns the process ID of the child process. If unsuccessful, a -1 is returned.

wait() Actions A process that calls wait() can: suspend (block) if all of its children are still running, or return immediately with the termination status of a child, or return immediately with an error if there are no child processes.

4. Process Data Since a child process is a copy of the parent, it has copies of the parent s data. A change to a variable in the child will not change that variable in the parent.

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = -1? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = -1, errno = if (p < 0) { ENOMEM perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = -1? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = -1, errno = if (p < 0) { ENOMEM perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = -1? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = -1, errno = if (p < 0) { ENOMEM perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = -1? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = -1, errno = if (p < 0) { ENOMEM perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

Δημιουργία στο μοντέλο του UNIX: fork()

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p =? mypid =? Κείμενο: pid_t p, mypid; p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid = 987? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid = 987? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

PID=981 PID=987 Δημιουργία στο μοντέλο του UNIX: fork() Δεδομένα : p = 987? mypid =? Κείμενο: pid_t p, mypid; p = fork(); p = 987 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father(); Δεδομένα : p = 0? mypid = 987? Κείμενο: pid_t p, mypid; p = fork(); p = 0 if (p < 0) { perror( fork ); else if (p == 0) { mypid = getpid(); child(); else { father();

Δημιουργία στο μοντέλο του UNIX: fork() Όλες οι διεργασίες προκύπτουν με fork() [σχεδόν όλες] Ίδιο πρόγραμμα με γονική διεργασία, αντίγραφο χώρου μνήμης, κληρονομεί ανοιχτά αρχεία, συνδέσεις, δικαιώματα πρόσβασης Αντικατάσταση προγράμματος διεργασίας: execve() Η γονική διεργασία ενημερώνεται για το θάνατο του παιδιού με wait() συλλογή τιμής τερματισμού (exit status) Μέχριτότε, παιδίπουέχεικαλέσειτηνexit() είναιzombie Αν ο γονέας πεθάνει πρώτα, η διεργασία γίνεται παιδί της init (PID = 1), που κάνει συνεχώς wait() prog-a 981 fork Prog-A 981 wait Prog-A 987 execve Prog-B 987 Prog-B exit 987 (zombie)

wait() / waitpid() Για κάθε fork() πρέπει να γίνει ένα wait() wait(&status) Μπλοκάρει έως οποιοδήποτε παιδί πεθάνει Το status κωδικοποιεί πώς πέθανε η διεργασία Κανονικά (exit()), λόγω κάποιου σήματος (SIGTERM, SIGKILL) Χρήσιμες μακροεντολές για την ερμηνεία του status WIFEXITED(), WEXITSTATUS(), WIFSIGNALED(), WTERMSIG() σας δίνεται η explain_wait_status() Μια πιο ευέλικτη wait(): waitpid() Περιμένει για αλλαγή κατάστασης συγκεκριμένου ή οποιουδήποτε PID διεργασίας-παιδιού Συμπεριφορά ελεγχόμενη από flags (WNOHANG, WUNTRACED)

explain_wait_status() void explain_wait_status(pid_t pid, int status) { if (WIFEXITED(status)) fprintf(stderr, "Child with PID = %ld terminated normally, exit status = %d\n", (long)pid, WEXITSTATUS(status)); else if (WIFSIGNALED(status)) fprintf(stderr, "Child with PID = %ld was terminated by a signal, signo = %d\n", (long)pid, WTERMSIG(status)); else if (WIFSTOPPED(status)) fprintf(stderr, "Child with PID = %ld has been stopped by a signal, signo = %d\n", (long)pid, WSTOPSIG(status)); else { fprintf(stderr, "%s: Internal error: Unhandled case, PID = %ld, status = %d\n", func, (long)pid, status); fflush(stderr);

explain_wait_status() void explain_wait_status(pid_t pid, int status) { if (WIFEXITED(status)) fprintf(stderr, "Child with PID = %ld terminated normally, exit status = %d\n", (long)pid, WEXITSTATUS(status)); else if (WIFSIGNALED(status)) fprintf(stderr, "Child with PID = %ld was terminated by a signal, signo = %d\n", (long)pid, WTERMSIG(status)); else if (WIFSTOPPED(status)) fprintf(stderr, "Child with PID = %ld has been stopped by a signal, signo = %d\n", (long)pid, WSTOPSIG(status)); else { fprintf(stderr, "%s: Internal error: Unhandled case, PID = %ld, status = %d\n", func, (long)pid, status); fflush(stderr); Παράδειγμα: pid = wait(&status); explain_wait_status(pid, status); if (WIFEXITED(status) WIFSIGNALED(status)) --processes_alive;

Κώδικας: παράδειγμα fork() / wait() void child(void) { compute(10000); exit(7); int main(void) { pid_t p; int status; p = fork(); if (p < 0) { perror("fork"); if (p == 0) { child(); p = wait(&status); explain_wait_status(p, status); return 0;

Σωληνώσεις στο UNIX (1) Διεργασία write fd[1] M άκρο εγγραφής read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο ανάγνωσης Ένας από τους βασικότερους μηχανισμούς στο UNIX Μονόδρομη μεταφορά δεδομένων Απότοάκροεγγραφής στο άκρο ανάγνωσης Δημιουργία με pipe(), επικοινωνία με write() και read() Αν η σωλήνωση είναι άδεια; η read() μπλοκάρει

Σωληνώσεις στο UNIX (1) Διεργασία Χώρος Χρήστη Χώρος Πυρήνα int fd[2]; int num1, num2; pipe(fd); write(fd[1], &num1, sizeof(num1)); read(fd[0], &num2, sizeof(num2));

Σωληνώσεις στο UNIX (1) Διεργασία Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης int fd[2]; int num1, num2; pipe(fd); write(fd[1], &num1, sizeof(num1)); read(fd[0], &num2, sizeof(num2));

Σωληνώσεις στο UNIX (1) Διεργασία write fd[1] M άκρο εγγραφής Χώρος Χρήστη Χώρος Πυρήνα άκρο ανάγνωσης int fd[2]; int num1, num2; pipe(fd); write(fd[1], &num1, sizeof(num1)); read(fd[0], &num2, sizeof(num2));

Σωληνώσεις στο UNIX (1) Διεργασία write fd[1] M άκρο εγγραφής int fd[2]; int num1, num2; read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο ανάγνωσης pipe(fd); write(fd[1], &num1, sizeof(num1)); read(fd[0], &num2, sizeof(num2));

Σωληνώσεις στο UNIX (1) Διεργασία write fd[1] read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης int fd[2]; int num1, num2; pipe(fd); write(fd[1], &num1, sizeof(num1)); read(fd[0], &num2, sizeof(num2));

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας Χώρος Χρήστη Χώρος Πυρήνα pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] read fd[0] Διεργασία παιδί write fd[1] read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] Διεργασία παιδί write fd[1] read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] Διεργασία παιδί read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] M άκρο εγγραφής Διεργασία παιδί read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Σωληνώσεις στο UNIX (2) Διεργασία πατέρας write fd[1] Διεργασία παιδί read fd[0] Χώρος Χρήστη Χώρος Πυρήνα άκρο εγγραφής άκρο ανάγνωσης pipe(fd); fork(); ο πατέρας κλείνει το άκρο ανάγνωσης τοπαιδίκλείνειτοάκροεγγραφής

Κώδικας: παράδειγμα IPC με UNIX pipes

Κώδικας: παράδειγμα IPC με UNIX pipes double value; int pfd[2]; pid_t p; if (pipe(pfd) < 0) { perror( pipe ); p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { if (read(pfd[0], &value, sizeof(value))!= sizeof(value)) { perror( read from pipe ); printf( child received value: value = %f\n, value); exit(0); else { compute_value(&value); if (write(pfd[1], &value, sizeof(value))!= sizeof(value)) { perror( write to pipe ); exit(0);

Κώδικας: παράδειγμα IPC με UNIX pipes double value; int pfd[2]; pid_t p; if (pipe(pfd) < 0) { perror( pipe ); p = fork(); if (p < 0) { perror( fork ); else if (p == 0) { if (read(pfd[0], &value, sizeof(value))!= sizeof(value)) { perror( read from pipe ); printf( child received value: value = %f\n, value); exit(0); else { compute_value(&value); if (write(pfd[1], &value, sizeof(value))!= sizeof(value)) { perror( write to pipe ); exit(0);