Pourquoi «Tout est un fichier» est-il unique aux systèmes d'exploitation Unix?

70

J'entends souvent les gens dire "la philosophie unique d'Unix est de traiter tout comme un fichier" ou "Sous Unix, tout est un fichier". Mais je n'ai jamais entendu personne expliquer pourquoi c'est unique à Unix.

Alors, pourquoi est-ce unique à Unix? Les autres systèmes d'exploitation tels que Windows et Mac ne fonctionnent-ils pas sur les fichiers?

Et est-ce unique comparé à d'autres systèmes d'exploitation?

Un étudiant Noob
la source
26
Note: Macosx tourne sur l'unix.
Akira
2
fwiw, même si les fichiers de niveau supérieur n’utilisent pas de fichiers (tout comme dbus ou X in * nix), Windows de bas niveau est construit autour de descripteurs. Vous pouvez faire beaucoup de choses avec eux comme avec des fichiers sur * nix (ouvrir, fermer, contrôler et généralement envoyer / recevoir), mais vous devez être un programmeur pour voir cette interface. Que ce soit une bonne chose ou non est une question de préférence.
Mark
1
tout est un fichier, sauf les interfaces réseau.
alvin
8
@akira - OSX est certifié Unix et ne fonctionne pas "dessus".
Rob
1
@akira Pas sur Unix. OSX est l'un des rares systèmes d'exploitation UNIX certifiés.
Let_Me_Be

Réponses:

53

Alors, pourquoi est-ce unique à Unix?

Les systèmes d'exploitation classiques, avant Unix, traitaient les fichiers dans un sens et traitaient chaque périphérique en fonction des caractéristiques de ce dernier. En d’autres termes, si la sortie d’un programme était écrite dans un fichier sur disque, c’était le seul endroit où la sortie pouvait aller; vous ne pouviez pas l'envoyer à l'imprimante ou au lecteur de bande. Chaque programme devait connaître chaque périphérique utilisé pour les entrées et les sorties et disposer d'options de commande permettant de gérer d'autres périphériques d'E / S.

Unix traite tous les périphériques en tant que fichiers, mais avec des attributs spéciaux. Pour simplifier les programmes, l'entrée et la sortie standard sont les périphériques d'entrée et de sortie par défaut d'un programme. Ainsi, les sorties de programme normalement destinées à l’écran de la console peuvent aller n’importe où, dans un fichier disque, une imprimante ou un port série. Ceci est appelé redirection d' E / S .

Les autres systèmes d'exploitation tels que Windows et Mac ne fonctionnent-ils pas sur les fichiers?

Bien sûr, tous les systèmes d’exploitation modernes prennent en charge divers systèmes de fichiers et peuvent «fonctionner sur des fichiers», mais la différence est de savoir comment les périphériques sont gérés. Je ne connais pas Mac, mais Windows propose une redirection d’entrée / sortie.

Et, comparé à quels autres systèmes d'exploitation, est-il unique?

Pas vraiment plus. Linux a la même fonctionnalité. Bien sûr, si un système d'exploitation adopte la redirection E / S, il a tendance à utiliser d'autres fonctionnalités Unix et finit par ressembler à Unix.

sciure
la source
29
OS X est fondamentalement Unix, donc il n'y a pas beaucoup de différence.
Slhck
6
il y a un peu plus à tout ce qu'un modèle de fichier.
artistoex
1
Le paragraphe d'ouverture n'est tout simplement pas vrai. Il existait des systèmes d'exploitation antérieurs à Unix et ils comportaient des fonctionnalités ultérieurement trouvées dans Unix, notamment la redirection des E / S.
Patrick Seymour
3
Le plan 9 a le même concept. Tout est un concept de fichier et a même été appelé "plus d'unix qu'unix"
William
2
Windows (depuis NT) va un peu plus loin. De nombreux périphériques se comportent comme des fichiers, tels que des ports série et des canaux nommés. Vous pouvez écrire à tous en utilisant WriteFile. Mais en plus, il existe une catégorie encore plus large d’objets de "synchronisation" qui comprend non seulement des fichiers mais également des mutex.
MSalters
34

L'idée que "tout est un fichier" est venue de Multics. Les concepteurs d’Unix se sont beaucoup inspirés de leurs prédécesseurs, notamment de Multics. En effet, beaucoup de choses en informatique sont basées sur des prédécesseurs.

Vous pouvez en savoir plus sur le travail de feu Dennis Ritchie dans la conception d'Unix. Il a référencé des éléments qu'ils ont "copiés" à partir de Multics, tels que le système de fichiers en forme d'arborescence, le shell de commande et la non-structuration des fichiers. Je ne veux pas dire que les gens d'Unix ont volé ceux de Multics. À toutes fins utiles, ce sont les mêmes personnes.

Patrick Seymour
la source
6
cela ne devrait pas être la réponse la plus votée, cela ne répond pas à la question, il demande simplement aux gens de poser une autre question: "Pourquoi" Tout est un fichier "dans Multics?"
Lie Ryan
13
@LieRyan: En fait, cela répond à la question: pourquoi est-ce unique : ça ne l'est pas.
Goran Jovic
1
Les gens d'Unix ont juste pris leurs idées avec eux quand le projet Multics a été arrêté et l'ont renommé. Unix n'est qu'un jeu de mots - un VS plusieurs.
Fiasco Labs
2
@Lie Ryan - La question n'était pas de savoir pourquoi tout est un fichier, mais pourquoi est-il unique? Comme Goran et moi l'avons signalé, ce n'est pas le cas.
Patrick Seymour
1
La question concerne vraiment le "système d'exploitation Unix s ", c'est-à-dire la famille. Cette famille comprend raisonnablement Multics et Linux.
MSalters
28

Unique? Définir? Absolument.

Tout avoir sous forme de fichier ou de périphérique dans une hiérarchie connue signifie que vous pouvez utiliser le même ensemble d'outils pour tout. Plan 9 de Bell Labs va encore plus loin avec même des périphériques matériels sous forme de fichiers.

Plus important encore, cela permet deux concepts très simples et puissants. Utilitaires de base qui font One Thing Well (tm), qui peuvent être reliés au besoin avec des tuyaux. Vous voulez trouver quelque chose dans un fichier texte? Utilisez-le catpour le montrer, le passer grepet vous cuisinez au gaz. C'est la vraie puissance de la méthode 'Unix' - des applications spécialisées travaillant ensemble pour une flexibilité énorme.

Mac OS X suit également la philosophie Unix, mais il est préférable de le masquer (un bundle 'application' est en réalité un répertoire plein de fichiers) et constitue en fait un véritable Unix certifié, issu de NeXT , qui utilisait des bits de FreeBSD .

Avec Windows, il existe certains composants binaires tels que l'observateur d'événements et le registre, et certains avantages en termes de rapidité s'y trouvent, dans ce scénario particulier.

Compagnon Geek
la source
1
Plus 1 pour mentionner le plan 9. IMHO Fuse rapproche le plan 9 d'une mise en œuvre par le biais d'une itération ad-hoc.
Danny Staple
2
Eh bien, le plan 9 est le plan 9, il fonctionne déjà en quelque sorte. Fuse permet simplement l’extension du système de fichiers en espace utilisateur de .. façons intéressantes. J'aime celui où IRC est traité comme un FS.
Compagnon Geek
Hmm - vous savez, ça fait longtemps que je cherche à le vérifier depuis que j'ai découvert cela dans un livre d'Eric Raymond il y a quelques années ... vous m'avez enfin rendu compte de la bosse "y aller", j'ai téléchargé l'ISO et l'essayer.
Danny Staple
2
Je crois qu’il existe aussi une nouvelle version, appelée inferno
Journeyman Geek
1
+1 pour avoir noté que Darwin d’OS X est aussi un "vrai Unix".
calum_b
18

À cause des fichiers spéciaux. Lorsque les gens disent "tout est un fichier sous Unix", les fichiers et les répertoires courants ne sont pas ce qu'ils ont en tête. Les fichiers spéciaux sont uniques aux systèmes d'exploitation de type Unix, et ils sont nombreux. Il est donc pas unique à l' Unix.

Les fichiers spéciaux servent à plusieurs fins. Il existe par exemple des tuyaux, des sockets et, plus particulièrement, des fichiers de périphérique. Les tuyaux et les sockets sont des flux de communication entre les processus. Une grande partie des fonctionnalités des sous-systèmes est mise à la disposition de l'espace utilisateur via les fichiers de périphérique.

Tuyaux et Douilles

Les programmes les utilisent comme ils utilisaient des fichiers ordinaires. En fait, la plupart du temps, ils ne se soucient même pas du type de fichier qu'ils utilisent. C'est pourquoi les commandes Unix peuvent être combinées de manière si multiple pour former de nouveaux systèmes puissants. (Voir la redirection des E / S dans la réponse de la sciure de bois)

Fichiers de périphérique

Comme mentionné précédemment, ils agissent comme des interfaces pour l’espace utilisateur. Par exemple, pour éjecter le plateau de disque compact, un programmeur doit d’abord ouvrir le fichier de périphérique correspondant. Autre exemple: vous voulez que votre programme bascule le terminal virtuel. Ouvrez / dev / console en premier.

Qu'est - ce qui se passe ensuite n'envoie pas de simples caractères à ces fichiers, mais l' émission ioctl () est sur eux. Les ioctls individuels que vous pouvez émettre dépendent du périphérique. Par exemple, la console est documentée dans console_ioctl (4)

artiste
la source
12

Je vais probablement être enthousiasmé pour avoir dit cela, mais je pense que dire que tout est un fichier sous Unix est en réalité une erreur. Ce que c'est vraiment, c'est deux choses.

  1. Les fichiers et les périphériques (et bien d'autres choses encore) sont des objets pouvant être modélisés par une interface composée de fonctions d'ouverture, de fermeture, de lecture, d'écriture et de contrôle (ioctl).
  2. L'espace de noms pour ces objets est hiérarchique, c'est-à-dire que ces objets sont organisés en une hiérarchie.

Un système de fichiers implémente cet espace de noms, ainsi que le framework permettant l'envoi de fonctions d'interface à ces objets. Un système de fichiers a d'abord été conceptualisé pour héberger des fichiers, mais a ensuite été coopté pour organiser d'autres objets dans la hiérarchie des espaces de noms. Un exemple de polymorphisme avant orienté objet était une chose.

Il n'y a pas de mal à appeler simplement tous les fichiers. Mais en réalité, ce sont ces objets plus génériques (un fichier en est un exemple). De ce point de vue, cette idée n’est pas unique à Unix. Beaucoup d'autres systèmes d'exploitation implémentent de telles hiérarchies d'objets polymorphes.

Ziffusion
la source
Exactement! Sous Unix, tout est un descripteur de fichier (pas nécessairement un fichier!), Autrement dit tout (sauf la mémoire) est une E / S, même un fichier. Les fichiers doivent être accessibles comme s’il s’agissait de flux d’E / S (bien qu’ils puissent être recherchés, donc accessibles de manière aléatoire, mais que le coût extrême des appels système supplémentaires). (à l'exception de ce que peu peut être fait avec mmap()bien sûr ....)
Greg A. Woods
9

Quand les gens disent "Sous Unix, tout est un fichier", cela veut dire que les choses qui ne sont pas des fichiers sont traitées comme des fichiers.

Bien sûr, la plupart des systèmes d'exploitation fonctionnent avec des fichiers. Fichiers texte, fichiers image, fichiers son. Mais tous les systèmes d'exploitation ne traitent pas les périphériques comme des fichiers. C'est une différence importante. Si je liste le contenu de mon dossier / dev / dans mon système d'exploitation Ubuntu (basé sur Unix), je reçois une liste de plus de 200 périphériques. Certains de ces périphériques sont matériels, mais apparaissent dans un dossier. Par exemple, les disques durs, les ports USB, la souris et le clavier, les périphériques audio et les imprimantes. Certains des périphériques sont virtuels, par exemple / dev / urandom, qui se comporte comme un fichier infini plein de nombres aléatoires. Ce n'est pas un vrai fichier sur mon disque dur.

Tous ces périphériques sont traités comme des fichiers. Je peux lire et / ou écrire des données dans ces appareils. Vous trouverez ici des exemples de copie de données de différents périphériques dans le périphérique audio. Cela est possible car ils sont traités comme des fichiers. Le résultat (geek) est la capacité d' écouter le contenu du disque dur, le mouvement de la souris, la mémoire de l'ordinateur ou les pixels d'une image. Cela serait beaucoup plus difficile à réaliser si les périphériques n'étaient pas traités comme des fichiers, car chaque périphérique nécessitait des méthodes différentes pour lire et écrire des données.

Cela étant dit, la signification de "tout" varie d'un système à l'autre. Par exemple, OS X est basé sur Unix, mais n’a pas de périphérique / dev / audio. Il utilise un système audio propriétaire appelé CoreAudio. Donc, dans ce cas, on pourrait dire "presque tout est un fichier". Ensuite, dans des systèmes tels que Windows, où "tout n'est pas un fichier", vous pouvez toujours faire des choses comme copier le contenu d'un fichier sur le port d'imprimante (en tapant quelque chose comme copy mydocument.txt >lpt1:), ce qui revient à copier un document sur le périphérique d'impression sous Unix. systèmes.

Les autres systèmes d'exploitation tels que Windows et OS X ne fonctionnent-ils pas sur les fichiers? Oui ils le font. Windows et OS X fonctionnent sur des fichiers, mais Windows ne traite pas les périphériques comme des fichiers, ce qui fait partie de ce que "tout est un fichier" signifie.

Abe
la source
8

Je vois Multics cité comme la source de "tout est un fichier", mais je pense que vous devez aller un peu plus loin que les fichiers de périphérique, les pipes nommées, les fichiers normaux, etc. Vous devez regarder la syntaxe de nommage des fichiers. Cela fait une grande différence même lorsque les "noms de fichiers magiques" AUX, CON et LP existent.

Voir " Le nom hideux " de Rob Pike. Il compare la syntaxe de dénomination de fichier Unix à quelques autres syntaxes, notamment VMS. Notez que les systèmes mainframe de la fin des années 60 et du début des années 70, à l’origine de la création d’Unix, avaient ce que l’esprit moderne considérerait comme une syntaxe de nommage des fichiers extraordinairement rococo. Cela fait des années que je n'ai pas utilisé VM / CMS, ou NOS ou NOS / VE, et je n'ai regardé que par-dessus l'épaule de quelqu'un qui utilise un système d'exploitation Univac, mais il suffit de dire que les bizarreries dépassaient les régularités.

Je n'ai même jamais vu Multics fonctionner, mais vous pouvez voir un papier sur son système de fichiers . Il semble que l’Unix original prenne le "tout est un fichier" un peu plus loin que Multics, mais votre kilométrage peut varier.

Bruce Ediger
la source
1
Eh bien, dans Multics, tout est mémoire, sauf les E / S (bien que cela puisse également être mappé sur la mémoire). Sous Unix, tout (sauf la mémoire) est un descripteur de fichier , y compris des fichiers. Par exemple, sous Unix, tout est I / O.
Greg A. Woods
1
BTW, un émulateur existe maintenant qui va démarrer et exécuter Multics.
Greg A. Woods
3

Veuillez noter que même Linus Torvalds n’est pas d’accord avec le fait que "tout est un fichier". Si vous recherchez "

tout est un bytestream

"vous trouverez des philosophies intéressantes sur le fait que nous voulons dire que tout n'est pas un fichier, par exemple une structure de données abstraite dans la mémoire ou un pointeur n'est sûrement pas un fichier, OK, tout peut être représenté sous forme de fichier mais représenter et être deux actions différentes .

Niklas Rosencrantz
la source
1
Vous n'avez pas fourni de lien. Lors de certaines recherches, j’ai trouvé yarchive.net/comp/linux/everything_is_file.html , citant les réponses de Torvald dans un fil de discussion, dans lequel il affirme implicitement que le modèle doit être "tout est un fichier".
bgvaughan
1
En fait, @bgvaughan, c'est l'inverse: yarchive.net/comp/linux/everything_is_file.html donne la citationThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
Little Ancient Ancient Kami
1
@LIttleAncientForestKami: et Unix traitent généralement les fichiers comme de simples flux d'octets, par opposition aux systèmes qui traitaient les fichiers comme des flux d'enregistrements (ou avaient à la fois des flux d'octets et des flux d'enregistrements), comme des collections de flux (ou de ressources), ou avaient modèles plus complexes, où il y avait plusieurs façons d'accéder à plusieurs types d'objets.
ninjalj