2011-10-09 2 views
0

Lire dans les manuels scolaires qu'il existe principalement deux méthodes d'accès au fichier; séquentiel et direct. Lequel utilise-t-on sous Linux?Méthode d'accès au fichier sous Linux

En commande de lecture, nous donnons le nombre d'octets à lire et à quel tampon. Donc nous avons un accès séquentiel sous Linux?

Mais physiquement, nous avons des fichiers stockés dans des blocs? Je ne pouvais pas comprendre cela.

Si l'accès direct possible sous Linux?

Je lis sur ces modèles d'accès dans les concepts du système d'exploitation par Galvin

Répondre

3

Les deux sont possibles.

Lorsque vous effectuez un read sur un fichier ordinaire, il lit le fichier de manière séquentielle, faisant avancer le pointeur de fichier à chaque fois de la bonne quantité.

Mais vous pouvez également utiliser seek pour passer à un point arbitraire dans le fichier.

Tous les fichiers ne prennent pas en charge l'accès aléatoire/direct. Par exemple, les tuyaux ne sont généralement accessibles que de manière séquentielle (vous ne pouvez pas revenir en arrière ou avancer).

Donc, à peu près tout est possible, mais certains types de fichiers ont des restrictions. fichier

(accès aux fichiers E/S directe (O_DIRECT drapeau) est un concept tout à fait différent.)

0

Vous pouvez certainement en lecture/écriture à partir d'une position arbitraire dans une ouverture (disque).

Il existe un certain nombre de méthodes pour effectuer des E/S aléatoires, qui sont optimisées pour différents types d'utilisation.

  • La méthode la plus simple est seek() suivie par read() ou write(). Le pointeur de fichier se déplace par la quantité d'octets lus/écrits, et il peut autoriser des E/S séquentielles après un saut aléatoire. Considérez seek() comme tournant logiquement l'ancien lecteur de bande «reel-to-reel» (même si nous n'en avons plus).
  • Les appels système pread et pwrite combinent seek() et read/write(), spécifiquement pour une utilisation dans des programmes multithread (où deux appels système conduiraient à une condition de concurrence). Ils ne modifient pas le pointeur de fichier, donc vous pouvez le penser logiquement en prenant ou en mettant un peu de données aléatoires. Mmap() mappe un fichier en mémoire - où vous pouvez ensuite en faire avec ce que vous voulez, en utilisant une manipulation conventionnelle de pointeur/mémoire (par exemple, memset, memcpy, etc.).