From c81d82509cd243b560c164c309ecab5ee3c2333c Mon Sep 17 00:00:00 2001 From: Denis Monnerat Date: Tue, 17 Sep 2024 08:55:50 +0200 Subject: [PATCH] tp3 --- tp/tp3/README.md | 114 ++++++++++++++++++++++++++++++++++++++ tp/tp3/src/copy1byte.c | 45 +++++++++++++++ tp/tp3/src/ex1-stdio.c | 12 ++++ tp/tp3/src/ex1-syscall.c | 14 +++++ tp/tp3/src/fork_and_fd1.c | 42 ++++++++++++++ tp/tp3/src/fork_and_fd2.c | 42 ++++++++++++++ tp/tp3/src/session.c | 18 ++++++ 7 files changed, 287 insertions(+) create mode 100644 tp/tp3/README.md create mode 100644 tp/tp3/src/copy1byte.c create mode 100644 tp/tp3/src/ex1-stdio.c create mode 100644 tp/tp3/src/ex1-syscall.c create mode 100644 tp/tp3/src/fork_and_fd1.c create mode 100644 tp/tp3/src/fork_and_fd2.c create mode 100644 tp/tp3/src/session.c diff --git a/tp/tp3/README.md b/tp/tp3/README.md new file mode 100644 index 0000000..51b113c --- /dev/null +++ b/tp/tp3/README.md @@ -0,0 +1,114 @@ +# Processus + +#### Ex1 +Compilez et exécutez [ex1-stdio.c](src/ex1-stdio.c) et [ex1-syscall.c](src/ex1-syscall.c). +Expliquez. + +#### Ex2 +Compilez et exécutez [fork_and_fd1.c](src/fork_and_fd1.c) et [fork_and_fd2.c](src/fork_and_fd2.c). +Expliquez. + +#### Ex3 +Que fait le programme [copy1byte.c](src/copy1byte.c) ? +Décommentez la ligne du `fork`. Expliquez ce qui se passe. + +#### Ex4 +Ecrire un programme qui crée un processus fils. + +Dans le fils : + + * imprimer le retour de `fork()`, `getpid()`, `getppid()`. + * bloquer 4 secondes (`sleep`). + * se terminer avec `exit(2)`. + +Dans le père : + + * imprimer le retour de `fork()`, `getpid()`, `getppid()`. + * attendre la fin de son fils (`wait()`), et imprimer son code de retour. + * afficher alors la liste de tous les processus actifs (`execl()` avec + `ps -ef`). + + +#### Ex5 + +Le but de l'exercice est de détecter la présence d'un zéro dans un +tableau `unsigned char` de taille `SIZE` en découpant le travail entre +plusieurs processus. On part du programme source suivant : + +```c +#define SIZE 1000 +int search(const unsigned char * t,int start,int end) +{ + /* renvoie 1 s'il y a un 0 dans la tranche du tableau, + * 0 sinon */ + +} + +int main(int argc , char * argv[]) +{ + int i; + unsigned char arr[SIZE]; + + srandom(time(NULL)); + + for (i = 0; i < SIZE; i++) + arr[i] = (unsigned char) (random() % 255) + 1; + + printf("Enter a number between 0 and %d: ", SIZE); + scanf(" %d", &i); + if (i >= 0 && i < SIZE) arr[i] = 0; + + if (search(arr,0,SIZE-1)) + printf("Found !\n"); + else + printf("Not found !\n"); + return EXIT_SUCCES; +} +``` + +Combien y-at-il de 0 au plus dans le tableau ? Complétez la fonction +`search`, et testez. + + 1. Première version. Modifiez le programme pour que le processus crée + un fils. Le fils et le père cherche chacun le zéro dans une moitié + du tableau. Le fils communique le résultat à son père. Celui-ci, à + l'aide de son propre travail, donnera la réponse. + + 2. Deuxième version. Votre programme accepte sur la ligne de commande + un entier n entre 1 et 100. Le programme crée n fils + qui cherche chacun dans une partie du tableau. Le père attend la fin + de chacun de ses fils, récupère leur résultat et affiche la réponse. + + 3. Troisième version. On améliore la version précédente. Lorsque qu'un + fils trouve le 0 dans le tableau, et que le père en est averti, + faites en sorte que les autres fils vivants se terminent. On + utilisera la primitive `kill()` qui perment d'envoyer le signal de + terminaison (`SIGTERM`) à tout un groupe. + + +#### Ex6 +Exécutez le programme [session.c](src/session.c) et interprétez avec `ps` +les informations `pid,ppid,pgid,sess,tpgid` des processus créés. + +#### Ex7 +Écrire un programme qui pour `n>0` donné sur la ligne de commande, engendre l'arbre généalogique : +``` +0| + |\ 1 + | \ + | |\ 2 + | | \ + | | |\ ... + | | | \ + | | | |\ n + x x x x x +``` + +Chaque processus choisit un nombre au hasard entre 0 et 127. Le processus 0 affichera la plus grande valeur choisie par tous +les processus. + +Remarque : on pourra modifier la séquence de nombres aléatoires en utilisant srand dans chaque processus créé. (pourquoi ?) + + +#### Ex8 +Écrire un programme qui permet de tester si 2 fichiers sont différents (comme `diff -q`). diff --git a/tp/tp3/src/copy1byte.c b/tp/tp3/src/copy1byte.c new file mode 100644 index 0000000..02fe937 --- /dev/null +++ b/tp/tp3/src/copy1byte.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define msg1 "je suis le pere" +#define msg2 "je suis le fils !!!" + +int main(int argc,char * argv[]){ + + int infd,outfd; + ssize_t nbread; + char buf[1]; + pid_t p; + + if (argc != 3){ + + printf("%s infile outfile\n",argv[0]); + exit(1); + } + + infd = open(argv[1],O_RDONLY); + assert(infd >= 0); + outfd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); + assert(outfd >= 0); + + //p=fork(); // <- decommentez cette ligne + + while(1){ + + nbread=read(infd,buf,sizeof(buf)); + if (nbread <=0 ) break; + write(outfd,buf,sizeof(buf)); + + } + + + close(infd); + close(outfd); +} diff --git a/tp/tp3/src/ex1-stdio.c b/tp/tp3/src/ex1-stdio.c new file mode 100644 index 0000000..4bc5de2 --- /dev/null +++ b/tp/tp3/src/ex1-stdio.c @@ -0,0 +1,12 @@ +#include +#include +#include + + +int main(){ + + printf("NON"); + if (fork()) { + printf("OUI\n"); + } +} diff --git a/tp/tp3/src/ex1-syscall.c b/tp/tp3/src/ex1-syscall.c new file mode 100644 index 0000000..1b46b6a --- /dev/null +++ b/tp/tp3/src/ex1-syscall.c @@ -0,0 +1,14 @@ +#include +#include +#include + + +int main(){ + + //printf("NON"); + write(STDOUT_FILENO,"NON",3); + if (fork()) { + //printf("OUI\n"); + write(STDOUT_FILENO,"OUI\n",4); + } +} diff --git a/tp/tp3/src/fork_and_fd1.c b/tp/tp3/src/fork_and_fd1.c new file mode 100644 index 0000000..2c529b9 --- /dev/null +++ b/tp/tp3/src/fork_and_fd1.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define msg1 "je suis le pere" +#define msg2 "je suis le fils !!!" + +int main(int argc,char * argv[]){ + + int outfd; + pid_t p; + + if (argc != 2){ + + printf("%s file\n",argv[0]); + exit(1); + } + + //p=fork(); + outfd = open(argv[1],O_WRONLY|O_CREAT,0644); + assert(outfd >= 0); + p=fork(); + switch(p){ + case (pid_t)-1 : + perror(NULL); + exit(2); + + case (pid_t)0 : + write(outfd,msg2,strlen(msg2)); + break; + default : + write (outfd,msg1,strlen(msg1)); + break; + } + close(outfd); +} diff --git a/tp/tp3/src/fork_and_fd2.c b/tp/tp3/src/fork_and_fd2.c new file mode 100644 index 0000000..7a63fe5 --- /dev/null +++ b/tp/tp3/src/fork_and_fd2.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define msg1 "je suis le pere" +#define msg2 "je suis le fils !!!" + +int main(int argc,char * argv[]){ + + int outfd; + pid_t p; + + if (argc != 2){ + + printf("%s file\n",argv[0]); + exit(1); + } + + p=fork(); + outfd = open(argv[1],O_WRONLY|O_CREAT,0644); + assert(outfd >= 0); + //p=fork(); + switch(p){ + case (pid_t)-1 : + perror(NULL); + exit(2); + + case (pid_t)0 : + write(outfd,msg2,strlen(msg2)); + break; + default : + write (outfd,msg1,strlen(msg1)); + break; + } + close(outfd); +} diff --git a/tp/tp3/src/session.c b/tp/tp3/src/session.c new file mode 100644 index 0000000..2298fef --- /dev/null +++ b/tp/tp3/src/session.c @@ -0,0 +1,18 @@ +#include +#include + + + +int main(int argc, char *argv[]) +{ + if (fork()){ + printf("session = %d\n",getsid(getpid())); + while(1); + } else { + setsid(); + printf("session = %d\n",getsid(getpid())); + while(1); + } + return 0; +} +