From dae2d232efdf8864a01462d2740ed0d293a2050c Mon Sep 17 00:00:00 2001 From: ngwalang Date: Thu, 21 Sep 2023 20:18:32 +0200 Subject: [PATCH] TP3 --- SCR3.1/TP3/Z20500.txt | 1 + SCR3.1/TP3/Z20900.txt | 1 + SCR3.1/TP3/copy1byte.c | 45 +++++++++++++++++++++++++++++++++++ SCR3.1/TP3/copy1byte_nofork.c | 45 +++++++++++++++++++++++++++++++++++ SCR3.1/TP3/ex1-stdio.c | 12 ++++++++++ SCR3.1/TP3/ex1-syscall.c | 14 +++++++++++ SCR3.1/TP3/fork_and_fd1.c | 42 ++++++++++++++++++++++++++++++++ SCR3.1/TP3/fork_and_fd2.c | 42 ++++++++++++++++++++++++++++++++ SCR3.1/TP3/input | 1 + SCR3.1/TP3/output | 1 + SCR3.1/TP3/session.c | 18 ++++++++++++++ SCR3.1/TP3/tp3-reponses.txt | 12 ++++++++++ 12 files changed, 234 insertions(+) create mode 100644 SCR3.1/TP3/Z20500.txt create mode 100644 SCR3.1/TP3/Z20900.txt create mode 100644 SCR3.1/TP3/copy1byte.c create mode 100644 SCR3.1/TP3/copy1byte_nofork.c create mode 100644 SCR3.1/TP3/ex1-stdio.c create mode 100644 SCR3.1/TP3/ex1-syscall.c create mode 100644 SCR3.1/TP3/fork_and_fd1.c create mode 100644 SCR3.1/TP3/fork_and_fd2.c create mode 100644 SCR3.1/TP3/input create mode 100644 SCR3.1/TP3/output create mode 100644 SCR3.1/TP3/session.c create mode 100644 SCR3.1/TP3/tp3-reponses.txt diff --git a/SCR3.1/TP3/Z20500.txt b/SCR3.1/TP3/Z20500.txt new file mode 100644 index 0000000..e015745 --- /dev/null +++ b/SCR3.1/TP3/Z20500.txt @@ -0,0 +1 @@ +je suis le pereje suis le fils !!! \ No newline at end of file diff --git a/SCR3.1/TP3/Z20900.txt b/SCR3.1/TP3/Z20900.txt new file mode 100644 index 0000000..8e23c20 --- /dev/null +++ b/SCR3.1/TP3/Z20900.txt @@ -0,0 +1 @@ +je suis le fils !!! \ No newline at end of file diff --git a/SCR3.1/TP3/copy1byte.c b/SCR3.1/TP3/copy1byte.c new file mode 100644 index 0000000..fab6100 --- /dev/null +++ b/SCR3.1/TP3/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/SCR3.1/TP3/copy1byte_nofork.c b/SCR3.1/TP3/copy1byte_nofork.c new file mode 100644 index 0000000..02fe937 --- /dev/null +++ b/SCR3.1/TP3/copy1byte_nofork.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/SCR3.1/TP3/ex1-stdio.c b/SCR3.1/TP3/ex1-stdio.c new file mode 100644 index 0000000..4bc5de2 --- /dev/null +++ b/SCR3.1/TP3/ex1-stdio.c @@ -0,0 +1,12 @@ +#include +#include +#include + + +int main(){ + + printf("NON"); + if (fork()) { + printf("OUI\n"); + } +} diff --git a/SCR3.1/TP3/ex1-syscall.c b/SCR3.1/TP3/ex1-syscall.c new file mode 100644 index 0000000..1b46b6a --- /dev/null +++ b/SCR3.1/TP3/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/SCR3.1/TP3/fork_and_fd1.c b/SCR3.1/TP3/fork_and_fd1.c new file mode 100644 index 0000000..2c529b9 --- /dev/null +++ b/SCR3.1/TP3/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/SCR3.1/TP3/fork_and_fd2.c b/SCR3.1/TP3/fork_and_fd2.c new file mode 100644 index 0000000..7a63fe5 --- /dev/null +++ b/SCR3.1/TP3/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/SCR3.1/TP3/input b/SCR3.1/TP3/input new file mode 100644 index 0000000..8ca4f92 --- /dev/null +++ b/SCR3.1/TP3/input @@ -0,0 +1 @@ +La voie lactée, les gros yeux, le bonheur d'une impératrice diff --git a/SCR3.1/TP3/output b/SCR3.1/TP3/output new file mode 100644 index 0000000..c3dcb7e --- /dev/null +++ b/SCR3.1/TP3/output @@ -0,0 +1 @@ +La voie lactée, les gros yeux, le bonheur dune' impératrice diff --git a/SCR3.1/TP3/session.c b/SCR3.1/TP3/session.c new file mode 100644 index 0000000..2298fef --- /dev/null +++ b/SCR3.1/TP3/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; +} + diff --git a/SCR3.1/TP3/tp3-reponses.txt b/SCR3.1/TP3/tp3-reponses.txt new file mode 100644 index 0000000..862a588 --- /dev/null +++ b/SCR3.1/TP3/tp3-reponses.txt @@ -0,0 +1,12 @@ +Exercice 1) + +Avec stdio, le contenu du printf est mis en cache donc lors de la création du fils vu que les données sont partagées cela fait que le non est affiché deux fois +Or que l'appel système write envoie directement à la sortie standard + +Exercice 2) +Premier code : Le fork est après l'ouverture donc le père et le fils se partagent le fd et si l'un écrit l'offset se met à jour pour que les contenus des deux processus soient enregistrés +Deuxième code : Le fork est avant l'ouverture donc chaque processus à son propre file descriptor, l'offset n'est pas partagé donc le contenu du fichier sera celui du dernier processus qui a écrit uniquement + +Exercice 3) +Le code copie le contenu d'une fichier vers un autre +En décommentant le fork