diff --git a/.gitignore b/.gitignore index 236a544..ec4664a 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,7 @@ code/ex_curses code/hello code/arguments code/no-op - +code/get-signal diff --git a/chap/IPC.tex b/chap/IPC.tex index 6e89d9b..d007625 100644 --- a/chap/IPC.tex +++ b/chap/IPC.tex @@ -4,24 +4,53 @@ \textit{Inter Process Communication.} Il existe deux familles bien distinctes. Nous allons donc -les voir dans le désordre. +les voir dans le plus grand des désordres. % ================================================================ -\section{shared memory} \index{shared} - +\section{Signal} \index{signal} + +nous allonc commencer par le plus simple mécanisme d'IPC~: +le signal. +Et pour ça, nous allons utiliser (encore une fois ?) un exemple +futile, certes, mais simple à comprendre. + +Nous avons un programme qui tourne en boucle en effectuant des +taches complexes (simulées pour l'exemple par une nanosieste) et +nous souhaitons pouvoir lui demander d'afficher l'avancée de la +chose. + +\label{get-signal} +\lstinputlisting[language=c]{code/get-signal.c} + +\begin{verbatim} +fubar $ make get-signal +gcc -Wall get-signal.c -o get-signal +fubar $ ./get-signal & +[1] 14001 +fubar $ kill me, my pid is 14001 +kill -USR1 14001 +fubar $ count is 15 +kill -USR1 14001 +fubar $ count is 22 +kill %1 +fubar $ +[1]+ Terminated ./get-signal +fubar $ +\end{verbatim} % ================================================================ -\section{named pipe} % ================================================================ -\section{Signals} \index{signal} +\section{shared memory} \index{shared} -Non, on ne va pas parler du potentiel remplaçant de Whatsapp, -mais du plus simple mécanispe d'IPC. +Mémoire partagée. % ================================================================ +\section{named pipe} + +Tube nommé. diff --git a/code/Makefile b/code/Makefile index 6a39188..c55f8dc 100644 --- a/code/Makefile +++ b/code/Makefile @@ -19,3 +19,5 @@ arguments: arguments.c Makefile no-op: no-op.c Makefile gcc -Wall $< -o $@ +get-signal: get-signal.c Makefile + gcc -Wall $< -o $@ diff --git a/code/get-signal.c b/code/get-signal.c new file mode 100644 index 0000000..05cf297 --- /dev/null +++ b/code/get-signal.c @@ -0,0 +1,30 @@ +/* get-signal.c */ + +#include +#include +#include + +volatile int drapeau; + +void attraper(int value) +{ +drapeau = 1; +} + +int main(int argc, char *argv[]) +{ +int foo; + +printf("kill me, my pid is %d\n", getpid()); +signal(SIGUSR1, attraper); + +for (foo=0; foo<1337; foo++) { + if (drapeau) { + printf("count is %d\n", foo); + drapeau = 0; + } + sleep(1); /* simulate heavy computing */ + } +return 0; +} +