Comment les conditions de course affectent les lectures et les écritures (cela arrive en même time)

Disons que j'ouvre un file a pour la lecture. Que se passe-t-il si une application, appelons cela aWriter écrit dans ce file à des intervalles randoms. Y at-il des possibilités pour moi de recevoir un contenu de file incorrect si j'essaie d'ouvrir a pour une lecture et en même time un aWriter écrit une nouvelle ligne. Qu'arrive-t-il au file et qu'est-ce qui arrive à ce que je reçois de ma lecture.

Un autre scénario. Disons que j'ai un file b qui contient 100 lignes de text. J'ai aussi une application bWriter qui écrit à b à des moments randoms. Je veux supprimer les 80 premières lignes du file b . Supposons que bWriter veut écrire à b comme je l'ai ouvert, sera-t-il toujours capable d'écrire? Va-t-il abandonner et perdre c'est écrire?

Je request parce que j'écris un script Perl qui lie dans Syslog. J'ai demandé à Syslog d'écrire tous les journaux dans un file et mon script doit (toutes les 5 minutes) lire le contenu du file, faire d'autres choses, puis supprimer toutes les lignes de ce file et écrire les anciennes lignes dans une archive . J'utilise le file comme étape intermédiaire entre mon script et le dernier lieu de repos pour les journaux.

Quelqu'un peut-il me donner un aperçu de la façon dont cela fonctionne exactement?

Deux process peuvent avoir le même descripteur de file ouvert pour l'écriture. Comme avec n'importe quoi, le dernier exécuté gagne.

Lorsqu'un process ouvre un descripteur de file, un autre process lui écrit 80 lignes, le premier tampon de memory du process n'aura pas ces 80 lignes. S'il écrit alors le tampon sur le descripteur de file, le contenu du file sera uniquement celui qui se trouvait dans le deuxième tampon de memory.

Maintenant, cela étant dit beaucoup de programmes vont détecter ces jours-ci que le contenu du file d'origine a changé depuis sa dernière ouverture. Certains refuseront d'écrire, d'autres vous inviteront à recharger le tampon. Certains peuvent faire autre chose. C'est à chaque programme de s'assurer qu'il fait la bonne chose. Le kernel / système de files ne se soucie pas, et pour tout ce qu'il sait le tampon de memory manquant de 80 lignes est la bonne copy.

Maintenant, si c'est quelque chose de beaucoup plus important, par exemple une database, plutôt qu'un file text ou un document dans votre directory personnel, il est plus probable que le locking de file sera utilisé (ce qui ne veut pas dire que vim ou gedit ne ' t utiliser des verrous). Une database aura probablement aussi son propre mécanisme de locking interne.

La philosophie générale sur les plates-forms de style UNIX est de coopérer en ce qui concerne les écritures de file. Le locking n'est pas un mécanisme de contrôle de security (c'est ce que sont les permissions / ACL), c'est un mécanisme d'intégrité des données. Deux programmes qui veulent écrire des données veulent généralement s'assurer que datatables sont correctement écrites, ce qui permet de respecter les verrous les uns des autres. Le kernel / système de files mettra en garde contre les verrous mais laissera toujours chaque process faire ce qu'il pense être le meilleur. Toutefois, Linux prend en charge l'application de locking obligatoire en tant qu'option de assembly (cela peut également nécessiter un support du système de files, mais je n'en suis pas certain).

Vous pouvez lire plus d'informations sur les verrous dans l' article de locking de file de Wikipedia .