ASR31-valarche-2021/Exemples/06-Tubes2/exo1a.c

78 lines
1.4 KiB
C
Raw Permalink Normal View History

2021-10-13 08:43:24 +02:00
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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
}