From 915ec95e88777fc42f75c7664db2f393a54b0ede Mon Sep 17 00:00:00 2001 From: valarche Date: Wed, 13 Oct 2021 08:43:24 +0200 Subject: [PATCH] Exemples Tubes --- Exemples/05-Signaux/main.c | 51 +++++++++++++++++++ Exemples/05-Signaux/main2.c | 50 ++++++++++++++++++ Exemples/05-Signaux/signal-0.c | 27 ++++++++++ Exemples/05-Signaux/signal-1.c | 55 ++++++++++++++++++++ Exemples/05-Signaux/travailleur.c | 31 ++++++++++++ Exemples/05-Signaux/travailleur2.c | 38 ++++++++++++++ Exemples/06-Tubes/ecrivain.c | 22 ++++++++ Exemples/06-Tubes/exTube.c | 45 +++++++++++++++++ Exemples/06-Tubes/exo1.c | 71 ++++++++++++++++++++++++++ Exemples/06-Tubes/exo1a.c | 78 +++++++++++++++++++++++++++++ Exemples/06-Tubes/fils.c | 35 +++++++++++++ Exemples/06-Tubes/lecteur.c | 23 +++++++++ Exemples/06-Tubes/pere.c | 35 +++++++++++++ Exemples/06-Tubes/upipe.c | 28 +++++++++++ Exemples/06-Tubes2/a.out | Bin 0 -> 8440 bytes Exemples/06-Tubes2/ecrivain.c | 22 ++++++++ Exemples/06-Tubes2/exTube.c | 45 +++++++++++++++++ Exemples/06-Tubes2/exo1.c | 71 ++++++++++++++++++++++++++ Exemples/06-Tubes2/exo1a.c | 78 +++++++++++++++++++++++++++++ Exemples/06-Tubes2/fils.c | 35 +++++++++++++ Exemples/06-Tubes2/lecteur.c | 23 +++++++++ Exemples/06-Tubes2/pere.c | 35 +++++++++++++ Exemples/06-Tubes2/upipe.c | 28 +++++++++++ 23 files changed, 926 insertions(+) create mode 100644 Exemples/05-Signaux/main.c create mode 100644 Exemples/05-Signaux/main2.c create mode 100644 Exemples/05-Signaux/signal-0.c create mode 100644 Exemples/05-Signaux/signal-1.c create mode 100644 Exemples/05-Signaux/travailleur.c create mode 100644 Exemples/05-Signaux/travailleur2.c create mode 100644 Exemples/06-Tubes/ecrivain.c create mode 100644 Exemples/06-Tubes/exTube.c create mode 100644 Exemples/06-Tubes/exo1.c create mode 100644 Exemples/06-Tubes/exo1a.c create mode 100644 Exemples/06-Tubes/fils.c create mode 100644 Exemples/06-Tubes/lecteur.c create mode 100644 Exemples/06-Tubes/pere.c create mode 100644 Exemples/06-Tubes/upipe.c create mode 100755 Exemples/06-Tubes2/a.out create mode 100644 Exemples/06-Tubes2/ecrivain.c create mode 100644 Exemples/06-Tubes2/exTube.c create mode 100644 Exemples/06-Tubes2/exo1.c create mode 100644 Exemples/06-Tubes2/exo1a.c create mode 100644 Exemples/06-Tubes2/fils.c create mode 100644 Exemples/06-Tubes2/lecteur.c create mode 100644 Exemples/06-Tubes2/pere.c create mode 100644 Exemples/06-Tubes2/upipe.c diff --git a/Exemples/05-Signaux/main.c b/Exemples/05-Signaux/main.c new file mode 100644 index 0000000..f03ccd1 --- /dev/null +++ b/Exemples/05-Signaux/main.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +void action1 (int signum); /* sur SIGUSR1 */ +void action2 (int signum); /* sur SIGTERM */ +void action3 (int signum);/* sur SIGUSR2 */ + +int pid; + +int main(int argc, char *argv[]) { + + pid = fork(); + + if (pid == 0) { + execl("travailleur", "travailleur", NULL); + } + + printf("PID du père : %d\n", getpid()); + signal(SIGUSR1, &action1); + signal(SIGUSR2, &action3); + signal(SIGTERM, &action2); + + pause(); + + return EXIT_SUCCESS; +} + +void action1 (int signum) { + /* Le fils a terminé son travail */ + printf("Mon fils m'a envoyé SIGUSR1\n"); + kill(pid, SIGUSR2); + pause(); + kill(pid, SIGKILL); +} + +void action2(int signum) { + /* on recoit un signal de l'exterieur pour forcer la sauvegarde + du fils */ + printf("Le shell m'a envoyé SIGTERM\n"); + kill(pid, SIGUSR2); + pause(); + kill(pid, SIGKILL); +} + +void action3(int signum) { + printf(" Recu SIGUSR2 du fils\n"); + kill(pid, SIGKILL); +} \ No newline at end of file diff --git a/Exemples/05-Signaux/main2.c b/Exemples/05-Signaux/main2.c new file mode 100644 index 0000000..231c346 --- /dev/null +++ b/Exemples/05-Signaux/main2.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include + + +void action1(int signum); +void action2(int signum); +void action3(int signum); + +pid_t pid; + +int main(int argc, char *argv[]) { + + printf("Mon PID de pere : %d\n", getpid()); + + signal(SIGUSR2, &action2); + + pid = fork(); + + if (pid == 0) { + execl("travailleur2", "travailleur2", NULL); + } + + signal(SIGUSR1, &action1); + + signal(SIGTERM, &action3); + + pause(); + + return EXIT_SUCCESS; +} + +void action1(int signum) { + printf("Je tue mon fils\n"); + kill(pid, SIGKILL); +} + +void action2(int signum) { + printf("Mon fils a fini son travail\n"); + kill(pid, SIGUSR2); + pause(); +} + +void action3(int signum) { + printf("Je force mon fils à la sauvegarde\n"); + kill(pid, SIGUSR2); + pause(); +} diff --git a/Exemples/05-Signaux/signal-0.c b/Exemples/05-Signaux/signal-0.c new file mode 100644 index 0000000..6e6403e --- /dev/null +++ b/Exemples/05-Signaux/signal-0.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +void sighandler (int signum); + + +int main(int argc, char *argv[]) { + + char buffer[256]; + + if (signal(SIGTERM, &sighandler) == SIG_ERR) { + printf("Ne peut pas manipuler le signal\n"); + exit(1); + } + + while (1) { + fgets(buffer, sizeof(buffer), stdin); + printf("Input : %s", buffer); + } + return EXIT_SUCCESS; +} + +void sighandler (int signum) { + printf("Masquage du signal SIGTERM\n"); +} \ No newline at end of file diff --git a/Exemples/05-Signaux/signal-1.c b/Exemples/05-Signaux/signal-1.c new file mode 100644 index 0000000..7c1d3a7 --- /dev/null +++ b/Exemples/05-Signaux/signal-1.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include + +#define FOREVER for(;;) + +static void action (int sig); + +int main(int argc, char *argv[]) { + +int i, pid, etat; +sig_t s1, s2; + +s1 = signal(SIGUSR1, action); +s2 = signal(SIGUSR2, action); +if (( s1 == SIG_ERR) || (s2 == SIG_ERR)) { + perror("Erreur attachement signal"); + exit(1); +} + +if ((pid = fork()) == 0) { + pause(); + kill(getppid(), SIGUSR1); + sleep(10); +} +else { + sleep(2); + kill(pid, SIGUSR2); + pause(); + printf("Parent : Demande terminaison du fils\n"); + fflush(stdout); + kill(pid, SIGTERM); + wait(&etat); + printf("Parent : fils terminé\n"); + fflush(stdout); +} + return EXIT_SUCCESS; +} + +static void action(int sig) { + switch (sig) { + case SIGUSR1 : + printf("Parent : signal SIGUSR1 recu\n"); + fflush(stdout); + break; + case SIGUSR2 : + printf("Fils : signal SIGUSR2 recu\n"); + fflush(stdout); + break; + default : + break; + } +} \ No newline at end of file diff --git a/Exemples/05-Signaux/travailleur.c b/Exemples/05-Signaux/travailleur.c new file mode 100644 index 0000000..cd0fb36 --- /dev/null +++ b/Exemples/05-Signaux/travailleur.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include + +void action_sauvegarde(int signum); + +int main(int argc, char *argv[]) { + + signal(SIGUSR2, &action_sauvegarde); + + /* Charger des données */ + printf("Calcul\n"); + sleep(10); + + kill (getppid(), SIGUSR1); + + pause(); + + return EXIT_SUCCESS; +} + +void action_sauvegarde(int signum) { + printf("Sauvegarde\n"); + sleep(1); + + kill(getppid(), SIGUSR2); + + pause(); +} \ No newline at end of file diff --git a/Exemples/05-Signaux/travailleur2.c b/Exemples/05-Signaux/travailleur2.c new file mode 100644 index 0000000..898e401 --- /dev/null +++ b/Exemples/05-Signaux/travailleur2.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include + +void action_sauvegarde(int signum); +int b; + +int main(int argc, char *argv[]) { + + signal(SIGUSR2, &action_sauvegarde); + /* charge des données */ + + /* fait un calcul */ + b = 1; + printf("Je fais un calcul\n"); + sleep (10); + b = 0; + kill (getppid(), SIGUSR2); + + pause(); + + return EXIT_SUCCESS; +} + +void action_sauvegarde(int signum) { + /* sauvegarde */ + if (b==1) { + printf("Je sauvegarde donnée corrompue\n"); + sleep(2); + } else { + printf("Je sauvegarde donnée ok\n"); + sleep(2); + } + kill(getppid(), SIGUSR1); + pause(); +} \ No newline at end of file diff --git a/Exemples/06-Tubes/ecrivain.c b/Exemples/06-Tubes/ecrivain.c new file mode 100644 index 0000000..a664cd6 --- /dev/null +++ b/Exemples/06-Tubes/ecrivain.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int main (void) { + int fd; + char message[26]; + + sprintf(message, "bonjour du writer [%d]\n", getpid()); + + fd = open("my_tube", O_WRONLY); + printf("Ici writer [%d]\n", getpid()); + if (fd != -1) { + write(fd, message, strlen(message)); + } + else + printf("Désolé, je trouve pas le tube\n"); + + close(fd); + return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes/exTube.c b/Exemples/06-Tubes/exTube.c new file mode 100644 index 0000000..e382304 --- /dev/null +++ b/Exemples/06-Tubes/exTube.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include + +int tube[2], fcntlLecture, fcntlEcriture; +char buf[10]; + +struct stat statLecture, statEcriture; + +void noeud (struct stat *statDesc) { + printf("Quelques caractérisitques du noeud\n"); + if (S_ISFIFO(statDesc->st_mode)) printf("\t Type : tube\n"); + else printf("\t Type : autre que tube\n"); + printf("\t Numéro : %llu\n", statDesc-> st_ino); + printf("\t Numéro de disque : %d\n", statDesc-> st_dev); + printf("\t Numéro de liens physiques : %d\n", statDesc-> st_nlink); + printf("\t Taille : %lld\n", statDesc-> st_size); +} + +main() { + if (pipe(tube) == -1) { perror("Création ratée"), exit(2); } + if ((fcntlLecture = fcntl(tube[0], F_GETFL)) == -1) { + perror("Fcntl lecture "); exit(2); } + if ((fcntlEcriture = fcntl(tube[1], F_GETFL)) == -1) { + perror("Fcntl ecriture "); exit(2); } + printf("Attributs de %d (tube[0]) : %d\n", tube[0], fcntlLecture); + printf("Attributs de %d (tube[1]) : %d\n", tube[1], fcntlEcriture); + write(tube[1], "0123456789", 10); + read(tube[0], buf, 5); + printf("Chaine lue : %s\n", buf); + + fstat(tube[0], &statLecture); + fstat(tube[1], &statEcriture); + if (memcmp(&statLecture, &statEcriture, sizeof(struct stat)) != 0) { + fprintf(stderr, "Noeuds en lecture et écriture différents\n"); + printf("Descripteur en lecture\n"); noeud(&statLecture); + printf("Descripteur en ecriture\n"); noeud(&statEcriture); + } else { + printf("Noeud en lecture et ecriture identique\n"); + noeud(&statEcriture); } +} diff --git a/Exemples/06-Tubes/exo1.c b/Exemples/06-Tubes/exo1.c new file mode 100644 index 0000000..5488d98 --- /dev/null +++ b/Exemples/06-Tubes/exo1.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include + +#define R 0 +#define W 1 + +void action (int sig) { + printf("Je capture le signal\n"); +} + +int main() { + int fdp[2], // père vers le fils + fdf[2]; // fils vers père + pid_t pid; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + char *phrasep = "message envoyé au fils par le père"; + + if ((pipe(fdp) != 0) || (pipe(fdf) != 0)) { + perror("Pipe pas possible"); + exit(1); + } + signal( SIGPIPE, &action); + + if ((pid = fork()) == -1) { + perror("Fork pas possible"); + exit(2); + } + + + if (pid == 0) { + + close(fdf[R]); // + close(fdp[W]); // + + if (write( fdf[W], phrasef, strlen(phrasef)+1) > 0) { + sleep(4); + int n = read(fdp[R], message, 100); + // Dans ce cas le signal SIGPIPE est recu => processus tué + printf("Valeur de n : %d\n", n); + if (n > 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Lecture pas bon"); + exit(2); + } + close(fdf[W]); + exit(0); + } else { + perror("Write pas bon"); exit(2); + } + } + + close(fdp[R]); + close(fdf[W]); + + write (fdp[W], phrasep, strlen(phrasep)+1); + sleep(2); + read(fdf[R], message, 100); + printf("J'ai lu : %s\n", message); + // wait(NULL); + close(fdp[W]); + + +return 0; +} diff --git a/Exemples/06-Tubes/exo1a.c b/Exemples/06-Tubes/exo1a.c new file mode 100644 index 0000000..d4d7e8b --- /dev/null +++ b/Exemples/06-Tubes/exo1a.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +#define R 0 +#define W 1 + +void action (int sig) { + printf("Je capture SIGPIPE\n"); + // quand les read se font sur des tubes sans écrivain +} + +int main() { + int fdp[2], // père vers le fils + fdf[2]; // fils vers père + pid_t pid; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + char *phrasep = "message envoyé au fils par le père"; + + if ((pipe(fdf) == -1) || (pipe(fdp) == -1)) { + perror("Pipe erreur"); + exit(1); + } + signal(SIGPIPE, &action); + + if ((pid = fork()) == -1) { + perror("Fork erreur"); + exit(2); + } + + if (pid == 0) { + close(fdf[R]); + close(fdp[W]); + + if (write(fdf[W], phrasef, strlen(phrasef)+1) != -1) { + sleep(4); + + if (read(fdp[R], message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + close(fdp[R]); + close(fdf[W]); + exit(0); + } + + close(fdp[R]); + close(fdf[W]); + + if (write(fdp[W], phrasep, strlen(phrasep)+1) != -1) { + sleep(2); + + if (read(fdf[R], message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(fdf[R]); + close(fdp[W]); + + return 0; +// A compléter + +} \ No newline at end of file diff --git a/Exemples/06-Tubes/fils.c b/Exemples/06-Tubes/fils.c new file mode 100644 index 0000000..b7f4768 --- /dev/null +++ b/Exemples/06-Tubes/fils.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + + +int main() { + int f1, f2; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + + f1 = open("f2p", O_WRONLY); + f2 = open("p2f", O_RDONLY); + + if (write(f1, phrasef, strlen(phrasef)+1) != -1) { + sleep(4); + + if (read(f2, message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(f1); + close(f2); + +return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes/lecteur.c b/Exemples/06-Tubes/lecteur.c new file mode 100644 index 0000000..449b204 --- /dev/null +++ b/Exemples/06-Tubes/lecteur.c @@ -0,0 +1,23 @@ +#include +#include +#include + +int main (void) { + int fd, n; + char input; + + fd = open("my_tube", O_RDONLY); + printf("Ici reader [%d]\n", getpid()); + if (fd != -1) { + printf("Recu par le reader : \n"); + while ((n = read(fd, &input, 1)) > 0) { + printf("%c", input); + } + printf("Le reader a fini sa mission\n"); + } + else + printf("Désolé, je trouve pas le tube\n"); + + close(fd); + return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes/pere.c b/Exemples/06-Tubes/pere.c new file mode 100644 index 0000000..61e0d2f --- /dev/null +++ b/Exemples/06-Tubes/pere.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + + +int main() { + int f1, f2; + + char message[100]; // pour récupérer un message + char *phrasep = "message envoyé au fils par le père"; + + f1 = open("f2p", O_RDONLY); + f2 = open("p2f", O_WRONLY); + + if (write(f2, phrasep, strlen(phrasep)+1) != -1) { + sleep(2); + + if (read(f1, message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(f1); + close(f2); + +return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes/upipe.c b/Exemples/06-Tubes/upipe.c new file mode 100644 index 0000000..7186a1b --- /dev/null +++ b/Exemples/06-Tubes/upipe.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +#define R 0 +#define W 1 + +int main ( ) { + int fd[2] ; + char message[100] ; + int nboctets ; + char *phrase = " message envoye au pere par le fils " ; + + pipe ( fd ) ; + if (fork() == 0) { + close ( fd[R] ) ; + write ( fd[W] , phrase , strlen (phrase) + 1 ) ; + close ( fd[W] ) ; + } + else { + close ( fd[W] ) ; + nboctets = read ( fd[R] , message , 100 ) ; + printf ( " Lecture %d octets : %s\n" , nboctets , message ) ; + close ( fd [R] ) ; + } + return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/a.out b/Exemples/06-Tubes2/a.out new file mode 100755 index 0000000000000000000000000000000000000000..a56997dce3882a7f4a3b1297bd3a4748f4cc6deb GIT binary patch literal 8440 zcmeHMeQXrR6`#F3$bm7O!H^4fl5OLtj$)sWf>M;GkqyR}V8A6V`Bc|y-`c)%zPs-3 zfk~}~1f)0>5wsyuRGIpkRxOp%h^n-T6sXdsN~@}Bs8UsJ#2-GJYfO`8xadvD%v-h9u_n|pXmPnV`?LZy&s7Sxi9G_e6Z--tgEv1o(P#S+-A z7mc*%k1rA8_!7;dC?KSWPm94>b_0+k9R*0r9)_(CdLQZ~T?d^+JF-0j^Ce9bQ5R{E zpGQn=1u5iFCo;N0te2%j_#1~k4m)WMI*E4GhCJ|j)J^I{K1ta=Uv^Va|0S_}473~e zVEvbnM`C%ltu2!tXv?HpGwEz$tktwfM}`tkF0mda4?`csZQc0=W(kf5+ss5C^&sZa zKHB!icePwd|#EVZhzHsZ_)iXbQrQz~hhwJbB>eJ)BKRFq*w@!}lD?dFx{&wAp z2fq2)6>U2|_a2HaNNzyWA$J7ym5_U?^qZ>m+pBbMF#J50=Q2}?`f8~z*05{_$UtgNstGbIKyImZ%C#(l94uB0#ded&&c#A*PRfv>@Wh>>G))RSZ3 z#L2Ok8p*MNb#g4KCUPvEW^$BoA;}4{9tp_( z0r}p5+#8U)19E#n-WZUR0l7IK>j61V`BZUMOc!S(u@e_+^eEss)_E!n&<_uM}ECNRSqYQPKWd--@r*Sdqbs7`+cSI*TYMJ z!@R{&J`S7^cb903N!i1#sa za>+lip4r&Jv+-%PRZF68$zPVC&#{ibpk1Q7^iluX~b->mP8_SJA#yHOQfxiG-7dYGB z3;rDRO}^d(&N^A<0m!QSy^wYEp∨*JV4puV-x z)%dWT@aOd}dT#qn4DhGG?4i-zHW5v=xE?3^{GEbE*J$5!K+KaPV`{9{L@~I0;^kONBak>WWUXQgN z5qnDSS1N0Pn|luReHVm1QR2D6GlgIJyDWXs%)15K(leIspUl`Bqn6{C!IGPm9D??l_&VOXWkaL{$K*mB|7ta3bygg>dD%g6; z(zE*Q`pqdElj5#VnQ1*!pzcubu?D>c)7?NWEAHWUz;i@Rh{+Es4`ZaSrmG`xbp)=C zz||4>KaM~nzA^70_T~9Y!nIaB7|{f-wc<3se~eQZcQ$}C{=&UL)I*nHvJmfHuH;T5 zro{b5#KW2whs8sh;JJSY#5jicbrs*>?t%>7@P!xyG4`tiT?@K^@|4emGls!kLag%n z46$q%H>tiCa^K9Ov_?N&RV zUU!SsL`MQR(=rFrLTiG!=r*xqhFFb>WSz)VZqU8;jJry5#zjI)W#pGrVshg}q2#zPCtSMtqaFZ%Li2 zM6OGzbG68IDRr(I^v|E`u(!&P;l~kSe>L{Z>uWr`iZjCAYV@+aKVd{E!4$@>kS&q9 z5%Kp5V;R1!$P^OWA@EH}rdlu7;ro$HF;DNWva9~{C4>G{`-E5{cKRjBSRego0_C3y z=ppQ0mY)dNiRZqSsm5y`_qR;T#k0Odru?U>@Gk`L7q5Un7O3wX*p;r@b1GnGd(H%O zKENnl;pYN&_NUjMFOCPx^W2iDme=%oU6qgHY*Y3dA##41qhWsOkLQ?7t3(?NO4o4e z&_B;cnQFxzh)P%fc`nMdQVhVZbe>-HuhtV!w?~vKkvv==8@}UD>PWlkHdgjVJVRK$R{}X}>5K>w6Y@;1%Yd@|JlR%az2`6$YQN}M zAMYwxo*nOou&eoqVLn!?sq^i<(C_uv7wtDMz^@T4Rrour^uM7#wVzgomWy3g{vN2p zk3v`NjiJ2{RoTB*rGG!5>uB>&p{xB+7g{4;4%m4bz6PD=3CE`n=gCZ!{T-Hvy&rat z-}7jHu>TJ1>inWTB0niW6OZpX^dSCv=)v*51v=Mj6newZG7sAB zx%VFf^1H6e-KLhSQE~*@io6;4L<5 zIe27E<&5D>ZoteKDK}?3hFKUBgSpXs#&WGxVqNkx8`obMWelaWX~VQ_^MGMxUHgC- zvdvM;NEJp$51>duGk|m#K&`RdI<(2k47Jjh$lZ++UAsGWY%#X%>@*B$3(BN~(Rts_ zjvd=JFSK~?$HLg!vujgFkFl$(>+UUmMqkIKo-K6YJuweD1+S_8i*$Q?@QHcAapqr` z`9{6KYNbrq^xwCG2JZzsm|+<7V`WolxO^2~Xr&)njrUBx&{*{jzR5`H1bFP)>*tD(HHHUo- zJ2Wv+NaOdUbV?+sjhN1eNTd#A;ZJhcmX>{%?XWQ(%vTK9Y%4>&6!IBYB)kDhxYihC zE^C-_-sC4bcJD}Fs8eGiVU5T&E#Y!GOSqEZ)ErF@qQV>;Ne5UNB7qGxiajDccc$yw z>4Aca?f0K1##j7g;aKy3CzQVts`Bb{b`vuA8yIo&_dJ}FkX4d5eIeE%L*W<~9D{=< z1p-&NPRQ>emZCq#3#WlgL1sM1L>!6t&l(VMj3eR{fMw(W=3#hC-vi=N?BNg}#GxF5 zt`f0KUj#9hBaU&$Byc)pRWI{NdqIr-C^H^8#_tW_m`{JaxAXxQ><4`?y#=D2 zq=H1;O;Ys!(nfk01YdbC6Myyt*QOM3<&T_mrqW5^+Obi&|96Af24s0_)axr`ra3&2 X913J8e~g3!*DcnB+qIW8y literal 0 HcmV?d00001 diff --git a/Exemples/06-Tubes2/ecrivain.c b/Exemples/06-Tubes2/ecrivain.c new file mode 100644 index 0000000..a664cd6 --- /dev/null +++ b/Exemples/06-Tubes2/ecrivain.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int main (void) { + int fd; + char message[26]; + + sprintf(message, "bonjour du writer [%d]\n", getpid()); + + fd = open("my_tube", O_WRONLY); + printf("Ici writer [%d]\n", getpid()); + if (fd != -1) { + write(fd, message, strlen(message)); + } + else + printf("Désolé, je trouve pas le tube\n"); + + close(fd); + return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/exTube.c b/Exemples/06-Tubes2/exTube.c new file mode 100644 index 0000000..e382304 --- /dev/null +++ b/Exemples/06-Tubes2/exTube.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include + +int tube[2], fcntlLecture, fcntlEcriture; +char buf[10]; + +struct stat statLecture, statEcriture; + +void noeud (struct stat *statDesc) { + printf("Quelques caractérisitques du noeud\n"); + if (S_ISFIFO(statDesc->st_mode)) printf("\t Type : tube\n"); + else printf("\t Type : autre que tube\n"); + printf("\t Numéro : %llu\n", statDesc-> st_ino); + printf("\t Numéro de disque : %d\n", statDesc-> st_dev); + printf("\t Numéro de liens physiques : %d\n", statDesc-> st_nlink); + printf("\t Taille : %lld\n", statDesc-> st_size); +} + +main() { + if (pipe(tube) == -1) { perror("Création ratée"), exit(2); } + if ((fcntlLecture = fcntl(tube[0], F_GETFL)) == -1) { + perror("Fcntl lecture "); exit(2); } + if ((fcntlEcriture = fcntl(tube[1], F_GETFL)) == -1) { + perror("Fcntl ecriture "); exit(2); } + printf("Attributs de %d (tube[0]) : %d\n", tube[0], fcntlLecture); + printf("Attributs de %d (tube[1]) : %d\n", tube[1], fcntlEcriture); + write(tube[1], "0123456789", 10); + read(tube[0], buf, 5); + printf("Chaine lue : %s\n", buf); + + fstat(tube[0], &statLecture); + fstat(tube[1], &statEcriture); + if (memcmp(&statLecture, &statEcriture, sizeof(struct stat)) != 0) { + fprintf(stderr, "Noeuds en lecture et écriture différents\n"); + printf("Descripteur en lecture\n"); noeud(&statLecture); + printf("Descripteur en ecriture\n"); noeud(&statEcriture); + } else { + printf("Noeud en lecture et ecriture identique\n"); + noeud(&statEcriture); } +} diff --git a/Exemples/06-Tubes2/exo1.c b/Exemples/06-Tubes2/exo1.c new file mode 100644 index 0000000..5488d98 --- /dev/null +++ b/Exemples/06-Tubes2/exo1.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include + +#define R 0 +#define W 1 + +void action (int sig) { + printf("Je capture le signal\n"); +} + +int main() { + int fdp[2], // père vers le fils + fdf[2]; // fils vers père + pid_t pid; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + char *phrasep = "message envoyé au fils par le père"; + + if ((pipe(fdp) != 0) || (pipe(fdf) != 0)) { + perror("Pipe pas possible"); + exit(1); + } + signal( SIGPIPE, &action); + + if ((pid = fork()) == -1) { + perror("Fork pas possible"); + exit(2); + } + + + if (pid == 0) { + + close(fdf[R]); // + close(fdp[W]); // + + if (write( fdf[W], phrasef, strlen(phrasef)+1) > 0) { + sleep(4); + int n = read(fdp[R], message, 100); + // Dans ce cas le signal SIGPIPE est recu => processus tué + printf("Valeur de n : %d\n", n); + if (n > 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Lecture pas bon"); + exit(2); + } + close(fdf[W]); + exit(0); + } else { + perror("Write pas bon"); exit(2); + } + } + + close(fdp[R]); + close(fdf[W]); + + write (fdp[W], phrasep, strlen(phrasep)+1); + sleep(2); + read(fdf[R], message, 100); + printf("J'ai lu : %s\n", message); + // wait(NULL); + close(fdp[W]); + + +return 0; +} diff --git a/Exemples/06-Tubes2/exo1a.c b/Exemples/06-Tubes2/exo1a.c new file mode 100644 index 0000000..d4d7e8b --- /dev/null +++ b/Exemples/06-Tubes2/exo1a.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +#define R 0 +#define W 1 + +void action (int sig) { + printf("Je capture SIGPIPE\n"); + // quand les read se font sur des tubes sans écrivain +} + +int main() { + int fdp[2], // père vers le fils + fdf[2]; // fils vers père + pid_t pid; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + char *phrasep = "message envoyé au fils par le père"; + + if ((pipe(fdf) == -1) || (pipe(fdp) == -1)) { + perror("Pipe erreur"); + exit(1); + } + signal(SIGPIPE, &action); + + if ((pid = fork()) == -1) { + perror("Fork erreur"); + exit(2); + } + + if (pid == 0) { + close(fdf[R]); + close(fdp[W]); + + if (write(fdf[W], phrasef, strlen(phrasef)+1) != -1) { + sleep(4); + + if (read(fdp[R], message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + close(fdp[R]); + close(fdf[W]); + exit(0); + } + + close(fdp[R]); + close(fdf[W]); + + if (write(fdp[W], phrasep, strlen(phrasep)+1) != -1) { + sleep(2); + + if (read(fdf[R], message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(fdf[R]); + close(fdp[W]); + + return 0; +// A compléter + +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/fils.c b/Exemples/06-Tubes2/fils.c new file mode 100644 index 0000000..b7f4768 --- /dev/null +++ b/Exemples/06-Tubes2/fils.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + + +int main() { + int f1, f2; + + char message[100]; // pour récupérer un message + char *phrasef = "message envoyé au père par le fils"; + + f1 = open("f2p", O_WRONLY); + f2 = open("p2f", O_RDONLY); + + if (write(f1, phrasef, strlen(phrasef)+1) != -1) { + sleep(4); + + if (read(f2, message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(f1); + close(f2); + +return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/lecteur.c b/Exemples/06-Tubes2/lecteur.c new file mode 100644 index 0000000..449b204 --- /dev/null +++ b/Exemples/06-Tubes2/lecteur.c @@ -0,0 +1,23 @@ +#include +#include +#include + +int main (void) { + int fd, n; + char input; + + fd = open("my_tube", O_RDONLY); + printf("Ici reader [%d]\n", getpid()); + if (fd != -1) { + printf("Recu par le reader : \n"); + while ((n = read(fd, &input, 1)) > 0) { + printf("%c", input); + } + printf("Le reader a fini sa mission\n"); + } + else + printf("Désolé, je trouve pas le tube\n"); + + close(fd); + return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/pere.c b/Exemples/06-Tubes2/pere.c new file mode 100644 index 0000000..61e0d2f --- /dev/null +++ b/Exemples/06-Tubes2/pere.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + + +int main() { + int f1, f2; + + char message[100]; // pour récupérer un message + char *phrasep = "message envoyé au fils par le père"; + + f1 = open("f2p", O_RDONLY); + f2 = open("p2f", O_WRONLY); + + if (write(f2, phrasep, strlen(phrasep)+1) != -1) { + sleep(2); + + if (read(f1, message, 100) >= 0) { + printf("J'ai lu : %s\n", message); + } else { + perror("Read erreur"); exit(4); + } + } else { + perror("Write erreur"); exit(3); + } + + + close(f1); + close(f2); + +return 0; +} \ No newline at end of file diff --git a/Exemples/06-Tubes2/upipe.c b/Exemples/06-Tubes2/upipe.c new file mode 100644 index 0000000..7186a1b --- /dev/null +++ b/Exemples/06-Tubes2/upipe.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +#define R 0 +#define W 1 + +int main ( ) { + int fd[2] ; + char message[100] ; + int nboctets ; + char *phrase = " message envoye au pere par le fils " ; + + pipe ( fd ) ; + if (fork() == 0) { + close ( fd[R] ) ; + write ( fd[W] , phrase , strlen (phrase) + 1 ) ; + close ( fd[W] ) ; + } + else { + close ( fd[W] ) ; + nboctets = read ( fd[R] , message , 100 ) ; + printf ( " Lecture %d octets : %s\n" , nboctets , message ) ; + close ( fd [R] ) ; + } + return 0; +} \ No newline at end of file