controle
This commit is contained in:
parent
4a3ab47e06
commit
f2da3f7155
106
ctrl_machine/README.md
Normal file
106
ctrl_machine/README.md
Normal file
@ -0,0 +1,106 @@
|
||||
# Contrôle machine BUT2FI 16/10/2024
|
||||
Créez un répertoire cntr_r3.05, et pour chaque exercice un sous-répertoire (EX1, EX2, EX3) pour y placer vos réponses.
|
||||
|
||||
Les exercices sont indépendants.
|
||||
- EX1 : fichiers, mémoire.
|
||||
- EX2 : signaux.
|
||||
- EX3 : processus, communication tubes.
|
||||
|
||||
> Vous rendrez une archive avec vos réponses [ici](http://www.iut-fbleau.fr/site/site/DEVOIR)
|
||||
|
||||
**Même si vous ne faites pas tout ce qui est demandé pour un exercice, donnez une solution modulaire en raffinant les problèmes
|
||||
pour montrer que vous avez compris et savez faire des choses : gestion de fichiers, gestions processus, etc.**:
|
||||
|
||||
|
||||
### EX1
|
||||
Écrire en C une commande qui prend en argument 2 noms de fichiers, et qui
|
||||
détermine si les deux fichiers ont le même contenu.
|
||||
|
||||
- Votre commande renverra le code de retour 0 (fichiers identiques) ou
|
||||
1 (fichiers différents). Vous testerez d'abord la taille des deux fichiers, et si nécessaire leur
|
||||
contenu.
|
||||
- Utilisez un buffer pour limiter les accès aux fichiers.
|
||||
|
||||
Fonctions et macro utiles :
|
||||
|
||||
```c
|
||||
int open(const char *pathname, int flags, ...
|
||||
/* mode_t mode */ );
|
||||
int stat(const char *restrict pathname,
|
||||
struct stat *restrict statbuf);
|
||||
off_t lseek(int fd, off_t offset, int whence);
|
||||
ssize_t read(int fd, void buf[.count], size_t count);
|
||||
int memcmp(const void s1[.n], const void s2[.n], size_t n);
|
||||
int close(int fd);
|
||||
```
|
||||
|
||||
|
||||
### EX2
|
||||
|
||||
La suite de syracuse est définie par
|
||||
|
||||
```
|
||||
u(n+1) = u(n)/2 si u(n) est pair
|
||||
3*u(n) + 1 sinon
|
||||
```
|
||||
|
||||
Une conjecture affirme que quelle que soit la valeur initiale u(0) non nul, la
|
||||
suite finit toujours par valoir 1 (puis boucler sur 4,2,1). Par exemple, à
|
||||
partir de 14, on construit la suite des nombres : 14, 7, 22, 11, 34, 17, 52, 26,
|
||||
13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, ...
|
||||
|
||||
On appelle :
|
||||
- temps de vol le plus petit indice k tel que u(k) = 1,
|
||||
- altitude maximale la plus grande valeur de la suite durant son temps de vol.
|
||||
|
||||
Le programme [syracuse.c](./src/syracuse.c) calcule, sans jamais s'arrêter, le temps de vol et
|
||||
l'altitude maximal en faisant varier le terme initial u(0). On sauvegarde le
|
||||
plus grand terme initiale testé, le plus grand temps de vol obtenu, et
|
||||
l'altitude maximale la plus grande calculée.
|
||||
|
||||
A l'aide de l'api des signaux, modifiez le programme pour que :
|
||||
|
||||
- à la réception du signal SIGTSTP (Ctrl-Z depuis le terminal), le programme affiche la
|
||||
valeur initiale courante, l’indice du dernier terme calculé et la valeur prise par la suite,
|
||||
sans stopper le programme (fonction `infos`),
|
||||
- le signal SIGINT (Ctrl-C depuis le terminal) reçu 2 fois dans un intervalle de 2 secondes termine le programme.
|
||||
|
||||
Fonctions et macro utiles :
|
||||
|
||||
```c
|
||||
int sigaction(int signum,
|
||||
const struct sigaction *_Nullable restrict act,
|
||||
struct sigaction *_Nullable restrict oldact);
|
||||
unsigned int alarm(unsigned int seconds);
|
||||
```
|
||||
### EX3
|
||||
|
||||
1. Donnez une commande bash qui permet de remplir un fichier avec avec `n` int (binaires) aléatoires.
|
||||
2. Écrire un programme C `min_max.c` qui prend en argument optionnel un nom de fichier et met en oeuvre le schéma de processus suivant :
|
||||
|
||||
```
|
||||
P -> P1 - -> P2
|
||||
\ ------- / \ -------- /
|
||||
\- > () () -/ \-> () ()-/
|
||||
-------- --------
|
||||
```
|
||||
|
||||
- Le processus P crée 2 fils, P1 et P2. P consomme le fichier généré à question 1 (un [exemple](./src/data.bin)) ou l'entrée standard, et envoie les entiers positifs
|
||||
au processus P1 à l'aide d'un tube.
|
||||
- P1 calcule le minimum au fur et à mesure et les transmet au fur et à mesure à P2 à l'aide d'un tube.
|
||||
- P2 calcule le maximum au fur et à mesure.
|
||||
|
||||
Lorsque tous les entiers sont passés, P1 et P2 affichent la valeur du miminimum et maximum.
|
||||
|
||||
|
||||
Fonctions et macro utiles :
|
||||
```c
|
||||
int rand(void);
|
||||
int pipe(int pipefd[2]);
|
||||
pid_t fork(void);
|
||||
int open(const char *pathname, int flags, ...
|
||||
/* mode_t mode */ );
|
||||
ssize_t read(int fd, void buf[.count], size_t count);
|
||||
ssize_t write(int fd, const void buf[.count], size_t count);
|
||||
int close(int fd);
|
||||
```
|
BIN
ctrl_machine/src/data.bin
Normal file
BIN
ctrl_machine/src/data.bin
Normal file
Binary file not shown.
51
ctrl_machine/src/syracuse.c
Normal file
51
ctrl_machine/src/syracuse.c
Normal file
@ -0,0 +1,51 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* variables pour le calcul */
|
||||
|
||||
long in, inmax, inkmax, inumax;
|
||||
long long k, kmax;
|
||||
long long u, umax;
|
||||
|
||||
|
||||
void infos(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("Plus grand terme initial : %ld\n", inmax);
|
||||
printf("Altitude maximale : %lld (v.i. %ld)\n", umax, inumax);
|
||||
printf("Plus long temps de vol : %lld (v.i. %ld)\n", kmax, inkmax);
|
||||
}
|
||||
void sig_alarme(int n)
|
||||
{
|
||||
infos();
|
||||
alarm(2);
|
||||
}
|
||||
void syracuse(void)
|
||||
{
|
||||
while ( u > 1 ) {
|
||||
if (u % 2) u = 3*u + 1;
|
||||
else u = u/2;
|
||||
if (u > umax) {
|
||||
umax = u;
|
||||
inumax = in;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
}
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
signal(SIGALRM, sig_alarme);
|
||||
alarm(2);
|
||||
for (in = 1; ; in++) {
|
||||
k = 0;
|
||||
u = in;
|
||||
syracuse();
|
||||
inmax = in;
|
||||
if (k > kmax) {
|
||||
kmax = k;
|
||||
inkmax = in;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user