Commit 5296f7b1 authored by Sander Mathijs van Veen's avatar Sander Mathijs van Veen

Merged fishbones.c and added begin of report.

parents 27b6e936 06da5243
......@@ -52,16 +52,12 @@ static void gup(FILE * log1, FILE * log2, int pipe_id[2], int myNumber)
if( c == 'P' )
{
fprintf(log1, "Child %d eats poison...", myNumber);
fprintf(log2, "Child %d eats poison...", myNumber);
fprintf(log3, "Child %d eats poison...", myNumber);
if( !antidote )
{
fprintf(log1, "no antidote, child will exit\n");
fprintf(log2, "no antidote, child will exit\n");
fprintf(log3, "no antidote, child will exit\n");
break;
fprintf(log1, "Child %d has no antidote for poison and will exit \n", myNumber);
fprintf(log2, "Child %d has no antidote for poison and will exit \n", myNumber);
fprintf(log3, "Child %d has no antidote for poison and will exit \n", myNumber);
break;
}
else
{
......@@ -69,7 +65,6 @@ static void gup(FILE * log1, FILE * log2, int pipe_id[2], int myNumber)
fprintf(log1, "antidote used (%d left) \n", antidote);
fprintf(log2, "antidote used (%d left) \n", antidote);
fprintf(log3, "antidote used (%d left) \n", antidote);
break;
}
}
else if( c == 'A' )
......@@ -155,7 +150,7 @@ main(int argc, char * argv[])
*/
/* Ignore newlines and spaces */
if( c == '\n' || (int)c == 32 )
if( c == '\n' || c == 32 )
{
continue;
}
......@@ -197,11 +192,12 @@ main(int argc, char * argv[])
gup(log1, log2, pipe_id, kiddoCount);
break;
default:
puts("Parent process continuing...");
fprintf(log1, "Started child process %d \n", child_id);
fprintf(log2, "Started child process %d \n", child_id);
}
}
}
fprintf(log1, "Program exited normally \n");
fprintf(log2, "Program exited normally \n");
fclose(log1);
......
*.log
*.toc
*.aux
report.pdf
report-dot2tex*
dot2tex.cache
\documentclass[10pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{enumerate}
\usepackage{listings}
\usepackage{url}
\usepackage{float}
\usepackage[dutch]{babel}
\usepackage{listings}
\lstset{
language=C,
numbers=left,
numberstyle=\footnotesize,
stepnumber=1,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=4,
captionpos=t,
breaklines=false
}
% dot graphs
\usepackage{dot2texi}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\title{Operating systems opdracht 3: \\ ICP met fork/pipe}
\author{Sander van Veen \& Tadde\"us Kroes}
\begin{document}
\maketitle
\tableofcontents
\pagebreak
\section{Inleiding}
Deze opgave gaat over inter-process communication (IPC). Hieronder vallen het
cre\"eren van processen met behulp van \texttt{fork()}, het overbrengen van data
tussen deze processen met behulp van een \texttt{pipe()}, en het sturen van
signals.
\subsection{Forken van processen}
Binnen POSIX-compatible besturingssystemen komen alle processen voort uit een
ouderproces, met als uitzondering \texttt{init}, want dat is de wortel van deze
procesboom. De meest gebruikte manier om een nieuwe process te starten is:
\begin{enumerate}
\item het huidige proces te forken met de functie \texttt{fork()}. Forken
maakt een kindproces aan en geeft het ouderproces het procesnummer
terug van het aangemaakte kindproces. In de taal C zou dat er zo uit
kunnen zien:
\begin{lstlisting}[numbers=none]
if( (cpid = fork()) < 0 )
perror("Fork() failure");
else if( cpid == 0 )
child_process();
else
parent_process();
\end{lstlisting}
Merk op dat \texttt{fork()} in feite een kopie maakt van het huidige
process en dat na \texttt{fork()} het kind- en het ouderproces elk een
eigen weg inslaan.
\item de functie \texttt{exec()} gebruiken om het kindproces (tijdelijk) te
vervangen door het nieuwe proces. De functie \texttt{exec()} is een
\emph{front-end} voor de functie \texttt{execve()} en daarom kunnen
ook alle andere functies worden gebruikt, die een {front-end} zijn voor
\texttt{execve()}.
\end{enumerate}
\noindent
In Linux maakt \texttt{fork()} gebruik van \emph{copy-on-write} voor het
geheugen. Daardoor zal \texttt{fork()} alleen CPU-tijd en geheugen nodig hebben
om de \emph{page tables} te kopie\"eren en de nieuwe \emph{task structure} aan
te maken voor het kindproces. Het gevolg is dat het forken van een proces
relatief gezien een goedkope operatie.
\subsection{Data oversturen tussen processen}
\begin{dot2tex}[dot,options=--cache --autosize]
digraph pipe {
rankdir=LR
node[shape="box"]; pipe;
node[shape="box",label="process A"]; a;
node[shape="box",label="process B"]; b;
a -> pipe [label="writes"];
pipe -> b [label="reads"];
}
\end{dot2tex}
\subsection{Signals sturen en ontvangen}
\end{document}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment