Salut tout le monde,
Voila je travaille sur un TP de programmation système en C sous linux.
Je vous expose le sujet de mon TP afin que vous puissiez comprendre mon problème :
Ecrivez un programme qui crée deux sous process communiquant par pipe. Le premier sous process (fils1) écrit une chaine dans le pipe. Celle-ci est lue par l'autre sous process (fils2) et imprimmée sur stdout. Le buffer de lecture du sous process fils2 sera de longueur 20.
- fils 1 écrit une chaine dont la longueur est INCONNUE et aléatoire entre 10 et 100. Gérer les codes de retour de lecture sur pipe pour programmer une terminaison du deuxième process.
- Si le premier envoie plusieurs messages, tous de longueurs inconnue du process de lecture, comment faire pour que ce dernier puisse reconstituer les messages d'origine ? Inventer et implémenter une solution.
Mon programme actuel envoie bien la chaine sur mon fils2 mais celui ne traite pas les dépassement sur son buffer :
Je pensais faire un malloc pour mon buffer (buff2) fils2 afin d'y stocker la valeurs entière envoyé par fils1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
63
64
65
66 #include <stdio.h> #include <unistd.h> #include <stdlib.h> void thread (int p[2], int thrd_nb) { char buff1[100], buff2[20]; int n; int *ptr; if (thrd_nb == 0) { close (p[0]); n = read (STDIN_FILENO, (void *) buff1, 100); write (p[1], (void *) buff1, n); } else if (thrd_nb == 1) { close (p[1]); n = read (p[0], (void *) buff2, sizeof(buff2)); if(n >= sizeof(buff2)){ fprintf(stdout,"buffer overflow...\n"); if(ptr =(char *)malloc(sizeof(n))==NULL){ perror("malloc"); exit(EXIT_FAILURE); } ptr=&buff1; fprintf(stdout,"lecture en mémoire: %s \n",ptr); } fprintf (stdout, "Lecture du pipe: "); fflush (stdout); write (STDOUT_FILENO, (void *) buff2, sizeof(buff2));} } int main () { int i, pid, p[2]; if (pipe (p) != 0) { perror ("pipe"); exit (EXIT_FAILURE); } for (i = 0; i < 2; i++) { pid = fork (); switch (pid) { case -1: perror ("fils1"); exit (EXIT_FAILURE); break; case 0: thread (p, i); return EXIT_SUCCESS; break; default: break; } } while (wait (NULL) > 0) ; return EXIT_SUCCESS; }
Mais j'avoue m’emmêler les pinceaux sur son utilisation étant encore débutant...
Cordialement.
Partager