Compare commits

...

4 Commits

Author SHA1 Message Date
tth
97f9196db6 IPC : added some bugs 2021-08-25 07:18:34 +02:00
tth
e306830003 not useless 2021-08-24 20:28:43 +02:00
tth
ea90f9ca02 quote 2021-08-23 11:46:02 +02:00
tth
2ea16e48ef bla 2021-08-23 11:34:22 +02:00
10 changed files with 180 additions and 7 deletions

6
.gitignore vendored
View File

@ -14,6 +14,7 @@ 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
@ -21,6 +22,5 @@ code/hello
code/arguments code/arguments
code/no-op code/no-op
code/get-signal code/get-signal
code/fifo-tx
code/fifo-rx

View File

@ -4,7 +4,8 @@
\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. les voir dans le plus grand des désordres, en commençant
par les grands classiques.
% ================================================================ % ================================================================
@ -68,7 +69,84 @@ Mémoire partagée.
% ================================================================ % ================================================================
\section{named pipe} \section{named pipe} \label{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é.

View File

@ -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. Ce fichier est abondamment commenté.
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,6 +31,11 @@ keyb fr
Écrit, sans le moindre doute, au « ras du métal ». Écrit, sans le moindre doute, au « ras du métal ».
% ---------------------------------------------------------- % ----------------------------------------------------------
\section{Fractint}
% ---------------------------------------------------------- % ----------------------------------------------------------

View File

@ -4,9 +4,11 @@
\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}
% ------------------------------------------------ % ------------------------------------------------

View File

@ -19,5 +19,17 @@ 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 $@

9
code/dtime.c Normal file
View File

@ -0,0 +1,9 @@
#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;
}

27
code/fifo-rx.c Normal file
View File

@ -0,0 +1,27 @@
/*** 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;
}

24
code/fifo-tx.c Normal file
View File

@ -0,0 +1,24 @@
/*** 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;
}

9
code/gcc-warnings.txt Normal file
View File

@ -0,0 +1,9 @@
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

7
code/my-fifo.h Normal file
View File

@ -0,0 +1,7 @@
typedef struct {
int pid;
double timestamp;
long notused;
} Message;
double dtime(void);