diff --git a/README.md b/README.md index 1948c8a..1d3f843 100644 --- a/README.md +++ b/README.md @@ -424,4 +424,38 @@ tom@Error404:/mnt/c/Users/naser/Documents/scr/r305_dm/TP3/Exo6$ ps -o pid,ppid,p - avec `SIGINT` l'arrêt du programme (après la demande d'une confirmation), avec l'affichage du temps écoulé depuis son lancement, quand on fait `ctrl+C` au terminal. - avec `SIGQUIT` la réinitialisation du calcul avec ctrl+\ depuis le terminal. (faites en sorte que toutes les valeurs restent cohérentes) -> Dans chaque handler, les 2 autres signaux seront bloqués. \ No newline at end of file +> Dans chaque handler, les 2 autres signaux seront bloqués. + +## Exercice 2 + +> Écrire un programme `mytimeout.c` dont l'usage est +```c +$mytimeout nbsec com [arg ...] +``` + +- Il lance la commande `com [arg ...]` (fork-and-exec). +- Il attend `nbsec` secondes, ou la fin de son fils. +- Si la commande n'est pas encore terminée au bout de du temps, il lui envoie le signal `SIGTERM`. + +> En cas de terminaison de la commande, il renvoie son code de retour, sinon renvoie le code 124. + +## Exercice 3 + +## Exercice 4 + +# TP 5 : Redirections, tubes + +## Exercice 1 + +1. Écrire un programme C pour calculer la taille du tampon système associé à un tube. (on pourra rendre l'écriture non bloquante avec `fcntl`) + +2. Écrire un programme C qui a le même comportement que la commande shell + +```shell +ls -i -l /tmp >> log +``` +3. Écrire un programme C qui a le même comportement que la commande shell + +```shell +ls . | wc -l +``` \ No newline at end of file diff --git a/TP5/Exo1/exo1_1.c b/TP5/Exo1/exo1_1.c new file mode 100644 index 0000000..4bb9fdf --- /dev/null +++ b/TP5/Exo1/exo1_1.c @@ -0,0 +1,15 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +int main(int argc, char *argv[]) +{ + int t[2]; + int size; + assert(pipe(t) == 0); + size = fcntl(t[0], F_GETPIPE_SZ); + printf("size = %d\n", size); + return 0; +} \ No newline at end of file diff --git a/TP5/Exo1/exo1_2.c b/TP5/Exo1/exo1_2.c new file mode 100644 index 0000000..89001c4 --- /dev/null +++ b/TP5/Exo1/exo1_2.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + printf("Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + int pip, fd[2], outfile, d; + char buf; + pip = pipe(fd); + assert(pip != -1); + + pid_t p = fork(); + assert(p != -1); + + outfile = open(argv[1], O_WRONLY | O_CREAT, 0644); + + switch (p) + { + case 0: + close(fd[0]); + d = dup2(fd[1], 1); + execl("/usr/bin/ls", "ls", "-i", "-l", "/tmp", NULL); + close(fd[1]); + exit(0); + default: + close(fd[1]); + while (read(fd[0], &buf, sizeof(char)) > 0) + { + write(outfile, &buf, sizeof(char)); + } + break; + } + + close(outfile); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/exo1_3.c b/exo1_3.c new file mode 100644 index 0000000..48da4c4 --- /dev/null +++ b/exo1_3.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include +#include + +int main(void) +{ + int fd[2], p; + char c; + + p = pipe(fd); + assert(p != -1); + + pid_t pr = fork(); + assert(pr != -1); + + switch (pr) + { + case 0: + close(fd[0]); + dup2(fd[1], 1); + execl("/usr/bin/ls", "ls", ".", NULL); + exit(0); + + default: + close(fd[1]); + dup2(fd[0], 0); + execl("/usr/bin/wc", "wc", "-l", NULL); + } + + close(fd[0]); + return 0; +} \ No newline at end of file