add: compte rendu final

This commit is contained in:
guamss 2026-05-24 10:44:08 +02:00
parent 3a5b0b86b7
commit c304cda7f5
5 changed files with 26 additions and 65 deletions

View File

@ -43,6 +43,8 @@ Ce rapport a pour but de montrer l'avancement du projet, notamment concernant la
## 2.1 Fonctionnement général du shell
### 2.1.1 Son rôle
Le projet se décompose en deux modules :
* Le SGF qui permet d'intéragir avec le disque
@ -58,6 +60,30 @@ Le travail du Shell se décompose en plusieurs étapes :
* Formater l'entrée utilisateur
* Exécuter la commande associée à l'entrée utilisateur (en faisant appel à des primitives du SGF)
### 2.1.2 Le mécanisme de pipe
Voici un exemple de commande utilisant un pipe
```bash
commande1 | commande2
```
Un pipe a pour utilité de passer les informations en sortie de la `commande1` en entrée à la `commande2`.
![Schéma simplifié des canaux d'un processus](../img/process.png)
Dans notre shell nous faisons en sorte grâce au mécanisme de pipe anonyme en C d'écraser la sortie standard (STDOUT) du processus fils de `commande1` par la référence d'écriture du pipe et d'écraser l'entrée standard (STDIN) du processus fils de `commande2` par la référence de lecture du pipe.
Comme ça la première commande pense afficher son résultat sur sa sortie standard alors qu'en réalité elle écrit sur le pipe anonyme créé au préalable.
Pareillement pour la seconde commande qui elle pense lire sur son entrée standard mais lis en fait ce qu'à écrit le premier processus. En quelques sortes, la première commande passe le relais à la seconde.
### 2.1.3 Le mécanisme de redirection
Le mécanisme de redirection consiste à rediriger la sortie d'une commande ou d'un ensemble de commande vers un fichier.
Pour cela on utilise les opérateurs `>` et `>>`.
* L'opérateur `>` redirige la sortie standard (STDOUT) de la dernière commande vers un fichier en écrasant les données déjà écrite dedans
* L'opérateur `>>` redirige la sortie standard (STDOUT) de la dernière commande vers un fichier sans écraser les données déjà écrite dedans
## 2.2 Fonctionnement général du SGF

BIN
docs/img/process.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -593,69 +593,6 @@ int do_cat(disk *disk, char *path_to_file) {
return 1;
}
int *find_all_occ_of_pattern(char *pattern, char *txt) {
int nbr_occ = 0;
int *idx_occs = NULL;
int pat_len = strlen(pattern);
int txt_len = strlen(txt);
if (pat_len == 0)
return NULL;
for (int i = 0; i <= txt_len - pat_len; i++) {
if (strncmp(&txt[i], pattern, pat_len) == 0) {
nbr_occ++;
idx_occs = realloc(idx_occs, (nbr_occ + 1) * sizeof(int));
if (idx_occs == NULL)
exit(EXIT_FAILURE);
idx_occs[nbr_occ - 1] = i;
idx_occs[nbr_occ] = -1;
}
}
return idx_occs;
}
int do_grep(char *pattern) {
char buffer[1024];
if (pattern == NULL) {
dprintf(STDERR_FILENO, "grep: pattern missing\n");
return -1;
}
ssize_t n;
while ((n = read(STDIN_FILENO, buffer, sizeof(buffer) - 1)) > 0) {
buffer[n] = '\0';
int *occs = find_all_occ_of_pattern(pattern, buffer);
if (occs == NULL || occs[0] == -1) {
continue;
}
int nbr_occ = 0;
for (nbr_occ = 0; occs[nbr_occ] != -1; nbr_occ++)
;
int new_size = n + (nbr_occ * (strlen(COLOR_RED) + strlen(ESCAPE_COLOR)));
char *colored_line = malloc(new_size + 1);
int last_pos = 0;
colored_line[0] = '\0';
for (int i = 0; occs[i] != -1; i++) {
int pos = occs[i];
strncat(colored_line, buffer + last_pos, pos - last_pos);
strcat(colored_line, COLOR_RED);
strncat(colored_line, buffer + pos, strlen(pattern));
strcat(colored_line, ESCAPE_COLOR);
last_pos = pos + strlen(pattern);
}
strcat(colored_line, buffer + last_pos);
write(STDOUT_FILENO, colored_line, strlen(colored_line));
free(occs);
free(colored_line);
}
return 1;
}
int redirect_out(disk *d, int mode, char *file, int in) {
char *parent_path;
char *dirname;

View File

@ -103,8 +103,6 @@ int exec_cmd_job(disk *d, char **args) {
persist_on_disk(d);
} else if (strcmp("cat", args[0]) == 0) {
do_cat(d, args[1]);
} else if (strcmp("grep", args[0]) == 0) {
do_grep(args[1]);
} else if (strcmp("echo", args[0]) == 0) {
do_echo(&args[1]);
} else {