+ exemple ipc/signal
This commit is contained in:
parent
b56f05cd3c
commit
646e3aacc9
2
.gitignore
vendored
2
.gitignore
vendored
@ -20,7 +20,7 @@ code/ex_curses
|
||||
code/hello
|
||||
code/arguments
|
||||
code/no-op
|
||||
|
||||
code/get-signal
|
||||
|
||||
|
||||
|
||||
|
49
chap/IPC.tex
49
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{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{shared memory} \index{shared}
|
||||
|
||||
Mémoire partagée.
|
||||
|
||||
% ================================================================
|
||||
|
||||
\section{named pipe}
|
||||
|
||||
% ================================================================
|
||||
|
||||
\section{Signals} \index{signal}
|
||||
|
||||
Non, on ne va pas parler du potentiel remplaçant de Whatsapp,
|
||||
mais du plus simple mécanispe d'IPC.
|
||||
|
||||
% ================================================================
|
||||
|
||||
Tube nommé.
|
||||
|
||||
|
@ -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 $@
|
||||
|
30
code/get-signal.c
Normal file
30
code/get-signal.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* get-signal.c */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user