+ 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/hello
|
||||||
code/arguments
|
code/arguments
|
||||||
code/no-op
|
code/no-op
|
||||||
|
code/get-signal
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
49
chap/IPC.tex
49
chap/IPC.tex
@ -4,24 +4,53 @@
|
|||||||
\textit{Inter Process Communication.}
|
\textit{Inter Process Communication.}
|
||||||
|
|
||||||
Il existe deux familles bien distinctes. Nous allons donc
|
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}
|
\section{shared memory} \index{shared}
|
||||||
|
|
||||||
|
Mémoire partagée.
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
\section{named pipe}
|
\section{named pipe}
|
||||||
|
|
||||||
% ================================================================
|
Tube nommé.
|
||||||
|
|
||||||
\section{Signals} \index{signal}
|
|
||||||
|
|
||||||
Non, on ne va pas parler du potentiel remplaçant de Whatsapp,
|
|
||||||
mais du plus simple mécanispe d'IPC.
|
|
||||||
|
|
||||||
% ================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,3 +19,5 @@ arguments: arguments.c Makefile
|
|||||||
no-op: no-op.c Makefile
|
no-op: no-op.c Makefile
|
||||||
gcc -Wall $< -o $@
|
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