Ceci est une question d’examen non résolue à moi. Deux processus Unix peuvent-ils écrire simultanément dans différentes positions dans un seul fichier?
Voici un script shell montrant la réponse restante 1. est correct:
# create a 10m file dd if=/dev/zero of=/var/tmp/file bs=1024k count=10 # create two 1 MB files cd /tmp printf "aaaaaaaa" > aa printf "bbbbbbbb" > bb i=0 while [ $i -lt 17 ]; do cat aa aa > aa.new && mv aa.new aa cat bb bb > bb.new && mv bb.new bb i=$((i+1)) done ls -lG /var/tmp/file /tmp/aa /tmp/bb # launch 10 processes that will write at different locations in the same file. # Uses dd notrunc option for the file not to be truncated # Uses GNU dd fdatasync option for unbuffered writes i=0 while [ $i -lt 5 ]; do ( dd if=/tmp/aa of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2)) 2>/dev/null & dd if=/tmp/bb of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2+1)) 2>/dev/null & ) & i=$((i+1)) done # Check concurrency printf "\n%d processes are currently writing to /var/tmp/file\n" "$(fuser /var/tmp/file 2>/dev/null | wc -w)" # Wait for write completion and check file contents wait printf "/var/tmp/file contains:\n" od -c /var/tmp/file
Sa sortie montre dix processus réussis et écrit simultanément dans le même fichier:
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/aa -rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/bb -rw-r--r-- 1 jlliagre 10485760 oct. 30 08:25 /var/tmp/file 10 processes are currently writing to /var/tmp/file /var/tmp/file contains: 0000000 aaaaaaaaaaaaaaaa * 4000000 bbbbbbbbbbbbbbbb * 10000000 aaaaaaaaaaaaaaaa * 14000000 bbbbbbbbbbbbbbbb * 20000000 aaaaaaaaaaaaaaaa * 24000000 bbbbbbbbbbbbbbbb * 30000000 aaaaaaaaaaaaaaaa * 34000000 bbbbbbbbbbbbbbbb * 40000000 aaaaaaaaaaaaaaaa * 44000000 bbbbbbbbbbbbbbbb * 50000000
Oui, ils peuvent bien sûr, avec les réserves suivantes:
open()
, un processus peut facilement effacer le contenu du fichier Définition :
Oui, les deux processus auront leurs propres entrées de table de fichiers.
Si le fichier est ouvert deux fois avec la fonction ouverte, le descripteur de deux fichiers est créé.
Chaque descripteur de fichier comporte des indicateurs de statut de fichier distincts.
Donc, le descripteur de deux fichiers a un descripteur de fichier d’autorisation d’écriture1 et le descripteur de fichier2 a la position initiale du point au premier caractère à classer.
Si nous spécifions une position à la fois dans le descripteur et dans le fichier, il peut être testé facilement.
Le contenu de fichier.txt
Je m’appelle Chandru. Ceci est un fichier vide.
Codage pour les tests:
#include #include #include main() { int fd1, fd2; if((fd1=open("file.txt", O_WRONLY)) <0){ perror("Error"); exit(0); } if((fd2=open("file.txt", O_WRONLY)) < 0) { perror("Error"); exit(0); } if(lseek(fd1,20,SEEK_SET) != 20) { printf("Cannot seek\n"); exit(0); } if(write(fd1,"testing",7) != 7) { printf("Error write\n"); exit(0); } if(lseek(fd2,10,SEEK_SET) != 10) { printf("Cannot seek\n"); exit(0); } if(write(fd2,"condition",9) != 9) { printf("Error write\n"); exit(0); } }
Sortie : après que ma sortie est
Je m'appelle isconditionitesting fichier vide.