Compare commits
No commits in common. "97f9196db681bba6674410917d728a35201e1cec" and "459cf8a8c8cec64ad0b3cb47b21fa699babf60a3" have entirely different histories.
97f9196db6
...
459cf8a8c8
6
.gitignore
vendored
6
.gitignore
vendored
@ -14,7 +14,6 @@ main.pdf
|
|||||||
main.toc
|
main.toc
|
||||||
|
|
||||||
code/a.out
|
code/a.out
|
||||||
code/*.o
|
|
||||||
code/foo
|
code/foo
|
||||||
code/thread-demo
|
code/thread-demo
|
||||||
code/ex_curses
|
code/ex_curses
|
||||||
@ -22,5 +21,6 @@ code/hello
|
|||||||
code/arguments
|
code/arguments
|
||||||
code/no-op
|
code/no-op
|
||||||
code/get-signal
|
code/get-signal
|
||||||
code/fifo-tx
|
|
||||||
code/fifo-rx
|
|
||||||
|
|
||||||
|
84
chap/IPC.tex
84
chap/IPC.tex
@ -4,8 +4,7 @@
|
|||||||
\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 plus grand des désordres, en commençant
|
les voir dans le plus grand des désordres.
|
||||||
par les grands classiques.
|
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
@ -69,84 +68,7 @@ Mémoire partagée.
|
|||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
\section{named pipe} \label{named-pipe}
|
\section{named pipe}
|
||||||
\index{fifo}
|
|
||||||
|
|
||||||
Un « FIFO » (ou « tube nommé ») peut être vu comme une sorte de
|
|
||||||
boite à lettres
|
|
||||||
dans laquelle on peut glisser un message à l'intention du
|
|
||||||
processus qui aura crée cette boite, avec un nom pré-défini afin
|
|
||||||
que l'expéditeur du message sache où le déposer.
|
|
||||||
|
|
||||||
\begin{quote}
|
|
||||||
A FIFO special file is similar to a pipe, except that it is created in a different way.
|
|
||||||
Instead of being an anonymous communications channel, a FIFO special file is entered
|
|
||||||
into the filesystem by calling mkfifo().
|
|
||||||
\end{quote}
|
|
||||||
|
|
||||||
Hop, une rapide démonstration. J'avais tout d'abors pensé à un
|
|
||||||
exemple minimaliste, puis je me suis dit~: « Et pourquoi ne pas
|
|
||||||
enmbarquer une charge utile dans le message ? », aussitôt dit
|
|
||||||
aussitôt fait.
|
|
||||||
|
|
||||||
L'émetteur mettra un \textsl{timestamp} dans le corps du message,
|
|
||||||
et le récepteur affichera l'écart avec le \textsl{timestamp} local.
|
|
||||||
Ce marqueur temporel sera obtenu par l'appel à
|
|
||||||
\texttt{gettimeofday(2)} \index{gettimeofday}
|
|
||||||
pour tenter d'avoir une précision
|
|
||||||
significative.
|
|
||||||
|
|
||||||
\subsection{Émetteur}
|
|
||||||
|
|
||||||
Son role est simple~: il met le timestamp dans l'enveloppe, et
|
|
||||||
la poste vers l'adresse qu'on lui passe sur la ligne de commande.
|
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/fifo-tx.c}
|
|
||||||
|
|
||||||
\subsection{Récepteur}
|
|
||||||
|
|
||||||
Pour faire simple, le récepteur des messages va passer l'intégralité
|
|
||||||
de son temps scotché devant la boite aux lettres, et attraper le
|
|
||||||
message dès son arrivée. Dans notre jargon, nous appellons ça
|
|
||||||
la méthode \textsl{buzzy-wait}.
|
|
||||||
|
|
||||||
Sauf que ça n'est pas tout à fait ça.
|
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/fifo-rx.c}
|
|
||||||
|
|
||||||
J'avoue ne pas avoir encore bien capté le deuxième argument
|
|
||||||
de mkfifo\dots
|
|
||||||
|
|
||||||
\subsection{Timestamp} \index{timestamp}
|
|
||||||
|
|
||||||
Comme promis un peu plus haut, le code est très simple.
|
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/dtime.c}
|
|
||||||
|
|
||||||
Cecit dit, la précision, ou plutôt la résolution,
|
|
||||||
est très dépendante du matériel,
|
|
||||||
de sa gestion par le système d'exploitation,
|
|
||||||
et et aussi\footnote{Mais faut-il s'étonner ?}
|
|
||||||
du \textsc{bofh} local.
|
|
||||||
|
|
||||||
\begin{quote}
|
|
||||||
The time returned by gettimeofday() is affected by discontinuous jumps
|
|
||||||
in the system time (e.g., if the system administrator manually changes
|
|
||||||
the system time). If you need a monotonically increasing clock, see
|
|
||||||
clock\_gettime(2).
|
|
||||||
\end{quote}
|
|
||||||
|
|
||||||
\subsection{Message}
|
|
||||||
|
|
||||||
Pour des raisons pas si évidente que ça, les messages transmis
|
|
||||||
doivent tous avoir la même taille. Nous allons donc définir
|
|
||||||
une structure (page ???) contenant les données à transmettre.
|
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/my-fifo.h}
|
|
||||||
|
|
||||||
C'est rudimentaire, mais ça fera l'affaire pour claquer un Bonaldi.
|
|
||||||
|
|
||||||
% ================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
Tube nommé.
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ le graphique. Il ne nécessite pas de système d'exploitation.
|
|||||||
La configuration de Dosbox est par défaut dans le fichier
|
La configuration de Dosbox est par défaut dans le fichier
|
||||||
\texttt{~/.dosbox/dosbox-0.74-2.conf}. Vous remarquerez
|
\texttt{~/.dosbox/dosbox-0.74-2.conf}. Vous remarquerez
|
||||||
que le numéro de version est \textbf{dans} le nom de
|
que le numéro de version est \textbf{dans} le nom de
|
||||||
ce fichier. Ce fichier est abondamment commenté.
|
ce fichier.
|
||||||
|
|
||||||
C'est à la fin de celui-ci, dans la section
|
C'est à la fin de celui-ci, dans la section
|
||||||
\texttt{autoexec} que vous pouvez rajouter ce genre de lignes~:
|
\texttt{autoexec} que vous pouvez rajouter ce genre de lignes~:
|
||||||
@ -31,11 +31,6 @@ keyb fr
|
|||||||
Écrit, sans le moindre doute, au « ras du métal ».
|
Écrit, sans le moindre doute, au « ras du métal ».
|
||||||
|
|
||||||
% ----------------------------------------------------------
|
% ----------------------------------------------------------
|
||||||
|
|
||||||
\section{Fractint}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ----------------------------------------------------------
|
% ----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,11 +4,9 @@
|
|||||||
|
|
||||||
\section{Flydraw}\index{Flydraw}
|
\section{Flydraw}\index{Flydraw}
|
||||||
|
|
||||||
\begin{quote}
|
|
||||||
flydraw is a drawing tool based on an interpreter which parses a
|
flydraw is a drawing tool based on an interpreter which parses a
|
||||||
language featuring rich graphic primitives; it uses libgd to output
|
language featuring rich graphic primitives; it uses libgd to output
|
||||||
GIF, JPEG, or PNG\index{PNG} files.
|
GIF, JPEG, or PNG\index{PNG} files.
|
||||||
\end{quote}
|
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ------------------------------------------------
|
||||||
|
|
||||||
|
@ -19,17 +19,5 @@ arguments: arguments.c Makefile
|
|||||||
no-op: no-op.c Makefile
|
no-op: no-op.c Makefile
|
||||||
gcc -Wall $< -o $@
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
#------------- IPC
|
|
||||||
|
|
||||||
get-signal: get-signal.c Makefile
|
get-signal: get-signal.c Makefile
|
||||||
gcc -Wall $< -o $@
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
dtime.o: dtime.c my-fifo.h Makefile
|
|
||||||
gcc -Wall -c $<
|
|
||||||
|
|
||||||
fifo-tx: fifo-tx.c my-fifo.h dtime.o Makefile
|
|
||||||
gcc -Wall $< dtime.o -o $@
|
|
||||||
|
|
||||||
fifo-rx: fifo-rx.c my-fifo.h dtime.o Makefile
|
|
||||||
gcc -Wall $< dtime.o -o $@
|
|
||||||
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
#include <stddef.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
double dtime(void)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
return (double)tv.tv_sec + ((double)tv.tv_usec)/1e6;
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
/*** named pipe --- receiver ***/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h> /* for mkfifo */
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include "my-fifo.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int fifo;
|
|
||||||
Message message;
|
|
||||||
double localTS;
|
|
||||||
|
|
||||||
if (argc!=2) exit(1);
|
|
||||||
fifo = mkfifo(argv[1], 0400);
|
|
||||||
if (fifo) {
|
|
||||||
perror("mkfifo fail");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
read(fifo, &message, sizeof(Message));
|
|
||||||
localTS = dtime();
|
|
||||||
printf("%f %f\n", localTS, message.timestamp);
|
|
||||||
close(fifo);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
/*** named pipe --- transmiter ***/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include "my-fifo.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int fifo;
|
|
||||||
Message message;
|
|
||||||
|
|
||||||
if (argc!=2) exit(1);
|
|
||||||
if (-1==(fifo = open(argv[1], O_WRONLY))) {
|
|
||||||
perror("open fifo for wr");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
message.pid = getpid();
|
|
||||||
message.timestamp = dtime();
|
|
||||||
write(fifo, &message, sizeof(Message));
|
|
||||||
close(fifo);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
gcc -std=c11 -pedantic -D_ANSI_SOURCE -fno-common \
|
|
||||||
-fno-diagnostics-show-option -fsanitize=undefined -Wbad-function-cast \
|
|
||||||
-Wstrict-prototypes -Wall -Wextra -Wformat-nonliteral -Wcast-align \
|
|
||||||
-Winline -Wundef -Wcast-qual -Wshadow -Wconversion -ffloat-store
|
|
||||||
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
|||||||
typedef struct {
|
|
||||||
int pid;
|
|
||||||
double timestamp;
|
|
||||||
long notused;
|
|
||||||
} Message;
|
|
||||||
|
|
||||||
double dtime(void);
|
|
Loading…
Reference in New Issue
Block a user