Les systèmes Unix évitent généralement les verrous obligatoires. Il y a quelques cas où le noyau verrouille un fichier contre les modifications des programmes utilisateur, mais pas s'il est simplement écrit par un autre programme. Aucun système Unix ne verrouillera un fichier car un programme y écrit.
Si vous voulez que les instances simultanées de votre script ne marchent pas les unes sur les autres, vous devez utiliser un mécanisme de verrouillage explicite tel que .flock
lockfile
Lorsque vous ouvrez un fichier à ajouter, ce qui est le >>
cas, chaque programme est garanti de toujours écrire à la fin du fichier. Ainsi, la sortie des instances multiples ne se remplacera jamais et si elles écrivent à tour de rôle, leur sortie sera dans le même ordre que les écritures.
La mauvaise chose qui pourrait arriver, c'est si l'une des instances écrit plusieurs morceaux de sortie et s'attend à ce qu'ils sortent ensemble. Entre les écritures consécutives d'une instance, d'autres instances peuvent effectuer leurs propres écritures. Par exemple, si l'instance 1 écrit foo
, puis l'instance 2 écrit hello
et seulement alors l'instance 2 écrit bar
, le fichier contient foohellobar
.
Un processus écrit efficacement dans le fichier lorsqu'il appelle l' write
appel système. Un appel à write
est atomique: chaque appel à write
écrit une séquence d'octets qui ne sera pas interrompue par d'autres programmes. Il y a souvent une limite à la quantité de données qu'un seul appel write
va écrire efficacement: pour les tailles plus grandes, seul le début des données est écrit et l'application doit rappeler write
. En outre, de nombreux programmes effectuent la mise en mémoire tampon: ils accumulent des données dans une zone mémoire, puis écrivent ces données en un seul morceau. Certains programmes vident le tampon de sortie après une ligne complète ou une autre séparation significative. Avec de tels programmes, vous pouvez vous attendre à ce que des lignes entières soient ininterrompues, tant qu'elles ne sont pas trop longues (jusqu'à quelques kilo-octets; cela dépend du système d'exploitation). Si le programme ne vide pas à des endroits significatifs, mais uniquement en fonction de la taille du tampon, vous pouvez voir quelque chose comme 4 Ko d'une instance, puis 4 Ko d'une autre instance, puis à nouveau 4 Ko de la première instance, etc.