diff --git a/2A/systeme/tp/1_tp/ex3 b/2A/systeme/tp/1_tp/ex3 index c173fcc..21cf90f 100755 Binary files a/2A/systeme/tp/1_tp/ex3 and b/2A/systeme/tp/1_tp/ex3 differ diff --git a/2A/systeme/tp/1_tp/ex4 b/2A/systeme/tp/1_tp/ex4 new file mode 100755 index 0000000..4591343 Binary files /dev/null and b/2A/systeme/tp/1_tp/ex4 differ diff --git a/2A/systeme/tp/1_tp/ex4.c b/2A/systeme/tp/1_tp/ex4.c index f4d7487..e598dd7 100644 --- a/2A/systeme/tp/1_tp/ex4.c +++ b/2A/systeme/tp/1_tp/ex4.c @@ -2,37 +2,65 @@ #include #include #include -#include +#include #include - +#include int main(int argc, char **argv) { - - pid_t pid; - int time = 2; - status = 0; - - switch(pid=fork()) { - - case -1 : // Oups !!! fork n'a pas marché ! - perror("fork"); exit(errno); - - case 0 : // Code du fils - printf("je suis le fils de %d\n", getppid()); - for(int i = 0; i <= 9; ++i) { - printf("%d \n", i); //\n ==> signale pour dire qu'il faut afficher à l'écran - usleep(500000); - } - system("ps -f"); - exit(2); - - default : // Code du père - pid = wait(&status); - printf("Mon fils m'a renvoyé le code de retour %d\n", WEXITSTATUS(status); - printf("Fin du processus père de pid %d.\n", getpid()); - } - - - - exit(0); + + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + int N = atoi(argv[1]); + + if (N <= 0) { + fprintf(stderr, "N doit être un entier positif.\n"); + exit(1); + } + + pid_t pid; + int etat; + struct timespec t; + int fils_id = 1; // Compteur pour l'identité des fils + + for (int i = 1; i <= N; i++) { + switch (pid = fork()) { + case -1: + perror("fork"); + exit(errno); + + case 0: + printf("[fils %d]: je suis le fils de pid %d\n", fils_id, getpid()); + for (int j = 0; j < 10; j++) { + printf("[fils %d]: %d\n", fils_id, j); + t.tv_sec = 0; + t.tv_nsec = i*500000000; + nanosleep(&t, NULL); + } + system("ps -f"); + exit(2); + + default: + fils_id++; // Incrémente le compteur pour le prochain fils + break; + } + } + + for (int i = 0; i < N; i++) { + if ((pid = wait(&etat)) == -1) { + perror("pb avec le wait"); + exit(errno); + } + if (WIFEXITED(etat)) + printf("[pere]: mon fils %d a retourne le code %d\n", pid, WEXITSTATUS(etat)); + else + printf("[pere]: mon fils %d s est mal termine\n", pid); + } + + printf("[pere]: Fin du processus pere de pid %d.\n", getpid()); + + exit(0); } +