1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| int pr[2], pw[2], output_fd;
if (argc < 2) {
printf("ERREUR: Arguments invalides\n");
return EXIT_FAILURE;
}
if ((pipe(pw) < 0) || (pipe(pr) < 0) || (output_fd = open(FILE, O_WRONLY | O_CREAT, 0600)) < 0) {
perror("init");
return EXIT_FAILURE;
}
if (fork() > 0) {
int n, state, nfds = 0;
fd_set r_fdset, w_fdset;
struct timeval dt = {5, 0};
while (1) {
FD_ZERO(&r_fdset);
FD_ZERO(&w_fdset);
FD_SET(pr[1], &w_fdset);
FD_SET(pw[0], &r_fdset);
nfds = (pr[1] > pw[0]) ? pr[1] : pw[0];
state = select(nfds+1, &r_fdset, &w_fdset, NULL, &dt);
if (state == -1) {
perror("select()");
break;
} else if (state > 0) {
if (FD_ISSET(pw[0], &r_fdset)) {
char c[10];
read(pw[0], c, 5*sizeof(char));
printf("Arrive %s\n", c);
break;
}
if (FD_ISSET(pr[1], &w_fdset)) {
printf("Depart\n");
write(pr[1], "test", 5*sizeof(char));
/* Fermeture du pipe */
close(pr[1]);
}
} else {
printf("Timeout\n");
break;
}
}
} else { /* Executeur */
char c[10];
int n;
n = read(pr[0], c, 5*sizeof(char));
printf("Choppe %s\n", c);
write(pw[1], c, n);
} |
Partager