2016-03-28 1 views
0

Le scénario:linux, lire/écrire le même fichier à partir processus différent, le processus de lecture a des données inattendues

    processus
  1. (A) ouvre fichiers avec le mode r+.
  2. Le processus (B) ouvre le même fichier avec le mode r+.
  3. le processus (A) y écrit des données et fflush().
  4. processus (A) notifie le processus (B) pour lire les données.
  5. processus (B) lit les données. < ---- voici le problème.

obtenu quelques octets inattendus (0000 0000 ...) à la partie de la tête et les octets de gauche sont corrects. PS: La taille des données est d'environ 16k, et je l'écris/lis avec un appel fwrite()/fread().

J'ai également fait un test, c'est-à-dire, si le processus (B) appelle fflush() avant de lire les données, le résultat est correct.

Ma question est,

  1. Quelle est la bonne façon de rendre le processus que (B) soit toujours en mesure de obtenir les données mises à jour?
  2. Comme le processus (A) a déjà appelé fflush(), pourquoi le processus (B) nécessite également pour fflush() avant de lire les données?
+0

Toutes les fonctions de gestion de fichiers lisent et écrivent * en mémoire tampon *. Si une partie du fichier est déjà dans les tampons, elle ne sera pas relue à partir du disque, mais renvoyée à partir des tampons. Si vous écrivez dans le même fichier à partir d'un autre processus, les tampons ne seront mis à jour qu'après un fflush() de ce fichier. Vous voudrez peut-être google pour * mécanismes de verrouillage de fichiers *. – tofro

+0

Postez votre code. Vous obtiendrez des réponses réelles de cette façon au lieu de deviner. –

Répondre

0

Chaque flux doit être rincée pour assurer le flux est prêt pour E/S. Lorsque vous ouvrez votre flux en cours (A), vous utiliserez quelque chose de similaire à:

FILE *fpA = fopen (filename, "r+"); 

puis dans le processus (B) vous faites quelque chose de similaire:

FILE *fpB = fopen (filename, "r+"); 

Les deux fpA et fpB sont séparés flux de données pour filename. Flotter seulement le flux du processus (A) n'a aucun effet sur ce qui est dans le flux du processus (B) et vice versa. La bonne façon est donc de s'assurer que chaque flux est vidé et prêt pour des E/S supplémentaires.

+0

Pas vraiment. Cela pourrait aider * un peu *, mais imaginez que ** les deux ** processus bougent à la même (milli-/micro-) seconde. Sans un mécanisme de verrouillage spécifique, il y a toujours un petit créneau d'incertitude où les parties du fichier sont déjà écrites, les parties ne le sont pas et le processus de lecture lit un fichier à moitié mis à jour. – tofro

+0

merci à tous, je pense que David a raison, et aussi, j'ai besoin d'un mécanisme de verrouillage. – user1482337