+ exemple ipc/signal

This commit is contained in:
tth 2021-08-18 09:49:28 +02:00
parent b56f05cd3c
commit 646e3aacc9
4 changed files with 72 additions and 11 deletions

2
.gitignore vendored
View File

@ -20,7 +20,7 @@ code/ex_curses
code/hello code/hello
code/arguments code/arguments
code/no-op code/no-op
code/get-signal

View File

@ -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.
% ================================================================

View File

@ -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
View 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;
}