Bonjour, j'ai un problème avec un read() qui me retourne -1 avec errno = EINVAL. Le "man" dit "The STREAM or multiplexer referenced by fildes is linked (directly or indirectly) downstream from a multiplexer".
Je suis sous UNIX (HP-UX en fait)
J'ai plusieurs fichiers à copier par rcp puis à lire, et je lis systématiquement l'un pendant que je fais la copie du suivant. Pour ça, je crée à chaque itération 2 threads, l'un fait la lecture du fichier pendant que l'autre fait la copie du fichier suivant. L'intérêt est que la lecture du fichier me fait faire quelques calculs qui me prennent de la cpu, et que pendant ce temps là, je peux continuer d'utiliser le réseau et copier le fichier d'après.
Dans le principe, mon code ressemble à ça:
Et j'utilise ça comme ça:
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 static void *remote_copy_file(void *p_data) { char *file_to_copy = p_data; char command[256]; sprintf(command, "rcp monAutreHost:%s %s", file_to_copy, file_to_copy); system(command); pthread_exit(0); } static void *process_file(void *p_data) { char *file_to_process = p_data; int fd = -1; fd = open(file_to_process...); read(fd...); /* Je détaille pas, ce serait un peu long sinon */ fait_des_calcul(...); read(fd...); fait_des_calcul(...); ... close(fd...); pthread_exit(0); } static void copy_while_process(char *file_to_copy, char *file_to_process) { pthread_t ta; pthread_t tb; if (file_to_copy != NULL) { pthread_create(&ta, NULL, remote_copy_file, file_to_copy); } if (file_to_process != NULL) { pthread_create(&tb, NULL, process_file, file_to_process); } if (file_to_copy != NULL) { pthread_join(ta, NULL); } if (file_to_process != NULL) { pthread_join(tb, NULL); } }
copy_while_process("/tmp/file1", NULL);
copy_while_process("/tmp/file2", "/tmp/file1");
copy_while_process("/tmp/file3", "/tmp/file2");
copy_while_process("/tmp/file4", "/tmp/file3");
copy_while_process(NULL, "/tmp/file4");
La plupart du temps, ça se passe bien, mais de temps en temps, je me prends un read qui retourne -1 avant la fin du fichier, avec l'erreur mentionnée au dessus. Ca arrive en plein milieu d'un fichier (je fais plusieurs read consecutifs sur le fichier. Les premiers passent bien, et j'ai ça au milieu).
Je me dis que je dois faire une mauvaise utilisation des threads, mais laquelle?
Merci à ceux qui m'ont lu jusqu'à la fin !
Partager