Bonjour,
J'utilise une fonction appelé f_ecriture_cmd qui permet de lancer une commande avec l'aide d'un fork. Elle recupere ce que l'executable envoi sur le terminal grace a dup2. Lors de la lecture des valeurs envoyées, grâce à la fonction read, le programme ne répond plus pendant quelques secondes, la fenetre devient grisatre comme si il n'y avait plus de réponse puis reprend pour finir le code. Es ce normal que la fonction read bloque la boucle principal ou es ce une erreur dans mon code ?
Merci
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
67
68
69
70
71
72
73
74
75
76
77 gboolean f_ecriture_cmd(gpointer p_data) { int p_to_cmd[2]; int p_from_cmd[2]; char bufferR[540]; /* Creation du pipe */ if(pipe(p_to_cmd)==-1) { f_error_prog("Pipe p_to_cmd(f_ecriture_cmd) err: "); return FALSE; } if(pipe(p_from_cmd)==-1) { f_error_prog("Pipe p_from_cmd(f_ecriture_cmd) err: "); return FALSE; } /* Creation du fork */ pid_fake = fork(); switch(pid_fake) { case (pid_t)-1: f_error_prog("Fork -1(f_ecriture_cmd) err: "); case (pid_t)0 : f_cmd_execvp(p_to_cmd,p_from_cmd,p_cmd); } close(p_from_cmd[1]); close(p_to_cmd[0]); do { nr=read(p_from_cmd[0], bufferR, sizeof bufferR); if(nr == -1) { f_error_prog("nr=-1 (f_ecriture_cmd) err: "); break; } if(nr == 0) break; bufferR[nr]='\0'; p_return = gtk_label_get_label(GTK_LABEL(p_label_terminal_aireplay)); p_temp=malloc((strlen(bufferR)+strlen(p_return)+1)*sizeof(char)); if(p_temp == NULL) { f_error_prog("Allocation de p_temp impossible(f_ecriture_cmd) err: "); return FALSE; } if(p_return != NULL) { if(strcpy(p_temp,p_return)==NULL) { f_error_prog("Copie de p_return dans p_temp impossible(f_ecriture_cmd) err: "); return FALSE; } } if(strcat(p_temp,bufferR)==NULL) { f_error_prog("Concatenation de bufferR dans p_temp impossible(f_ecriture_cmd) err: "); return FALSE; } string = g_utf8(p_temp); if(string != NULL) { gtk_label_set_label(GTK_LABEL(p_label_terminal_aireplay),string); g_free(string); } if(p_temp !=NULL) free(p_temp); } while(nr>0); close(p_to_cmd[1]); close(p_from_cmd[0]); return FALSE; }
Partager