web-dev-qa-db-fra.com

Sur quels systèmes // foo / bar est-il différent de / foo / bar?

Tout au long de la spécification POSIX, il est prévu ( 1 , 2 , ...) pour permettre aux implémentations de traiter un chemin commençant par deux / spécialement.

Une application POSIX (une application écrite dans la spécification POSIX pour être portable sur tous les systèmes compatibles POSIX) ne peut pas supposer que //foo/bar est le même que /foo/bar (bien qu'ils puissent supposer que ///foo/bar est le même que /foo/bar).

Maintenant, quels sont ces systèmes POSIX (historiques et toujours maintenus) qui traitent //foo spécialement? Je croyais (j'ai maintenant je me suis trompé ) que la disposition POSIX a été poussée par Microsoft pour leur variante Unix (XENIX) et peut-être la couche Windows POSIX (quelqu'un peut-il confirmer cela?).

Il est utilisé par Cygwin qui est également une couche de type POSIX pour Microsoft Windows. Existe-t-il des systèmes non Microsoft Windows? OpenVMS?

Sur les systèmes où //foo/bar est spécial, à quoi sert-il? //Host/path pour l'accès aux systèmes de fichiers réseau? Systèmes de fichiers virtuels?

Faites quelques applications fonctionnant sur des likes Unix - si ce n'est l'API du système - traitez //foo/bar les chemins spécialement (dans des contextes où ils traitent autrement /foo/bar comme chemin sur le système de fichiers)?


Edit , j'ai depuis posé une question sur la liste de diffusion austin-group sur l'origine de //foo/bar la manipulation dans la spécification, et la discussion est une lecture intéressante (du moins du point de vue archéologique).

116
Stéphane Chazelas

Ceci est une compilation et un index des réponses données jusqu'à présent. Ce message est wiki communautaire, il peut être édité par quiconque a plus de 100 points de réputation et personne n'en tire la réputation. N'hésitez pas à poster votre propre réponse et à y ajouter un lien ici (ou attendez que je le fasse). Idéalement, cette réponse ne devrait être qu'un résumé (avec des entrées courtes tandis que les autres réponses individuelles auraient les détails).

Systèmes actuellement maintenus activement:

Systèmes disparus

Applications qui traitent //foo/bar spécialement pour les chemins

92
Stéphane Chazelas

Est-ce que certaines applications fonctionnant sur Unix-like - si ce n'est l'API du système - traitent // foo/bar Paths spécialement?

Je connais Perforce qui utilise //depot/A/B/C/D Chemins pour se référer au dépôt. Perforce prend également en charge //Client/C/D Chemins, lorsque le client pointe vers //depot/A/B/. Ici, le FileSystem local peut ne pas avoir ces chemins.

p4 filelog //depot/A/B/C/D affichera l'historique de ce fichier, même s'il n'y a pas de fichier /depot/A/B/C/D.

p4 filelog C/D affichera également l'historique de ce fichier, s'il est exécuté à partir du répertoire approprié.

Référence: https://www.perforce.com/perforce/r12.1/manuals/cmdref/o.fspecs.html

16
Prem

Il y a plusieurs décennies, Tektronix Utek (Unix basé sur BSD 4.2, d'abord sur National Semiconductors 2016 CPU puis Motorola 6802 s) fournissait quelque chose appelé DFS ( système de fichiers distribué) sous lequel //foo/bar faisait référence au /bar fichier sur le serveur foo dfs. Il a ensuite été obsolète par le NFS de Sun.

Malheureusement, je n'ai pas encore fait référence à cela, mais je pourrais éventuellement trouver de la documentation Utek dans ma cave et mettre à jour cette réponse.

13
jlliagre

Suivre l'exemple à partir de cette réponse . Et en lisant la page 2-15 de le manuel de Bitsavers (merci @ grawity).

Données partagées
Le deuxième principe de conception du système de fichiers distribué Domain/OS, le partage par défaut, implique un espace de nom uniforme global. L'espace de noms du système de fichiers distribué apparaît aux utilisateurs comme celui d'un système de fichiers géant à temps partagé. Il s'agit d'un espace de noms hiérarchique UNIX traditionnel, sauf que les chemins absolus peuvent commencer par le nom de la racine du réseau (appelé //). Il est également possible d'exprimer des chemins d'accès par rapport à la racine du nœud local (le répertoire /).

Il y a aussi n ancien manuel de avec une "Première impression: juillet 1985". À la page 1-4:

Les doubles barres obliques (//) de la figure 1-2 représentent le niveau supérieur de l'arborescence de nommage, le répertoire racine du réseau.

Nous avons donc la confirmation que le domaine/système d'exploitation d'Apollo a utilisé // pour la racine du réseau.

7
user79743

Le projet ReactOS - qui est une implémentation gratuite et open-source du noyau NT et des API associées - s'est apparemment engagé à implémenter également son propre Interix - comme le sous-système POSIX (bien que le sous-système OS/2 d'origine de MS soit également mentionné dans le contexte , aucune mention n'est faite d'un analogue de ReactOS).

Bien que les efforts aient été jusqu'ici small , fork() est apparemment une réalité. Voici un extrait de la page du projet du sous-système, comme indiqué sous problèmes ouverts:

chemins

Quelle est la meilleure façon d'utiliser les chemins Win32 dans les applications POSIX? idées:

  • traduire //<device>/<path> dans \\.\<device>\<path> (avec un cas spécial pour les lettres de lecteur - //<letter>/<path> => <letter>:\<path> - et l'évasion spéciale //./<raw text> => \\.\<raw text>. Les chemins UNC peuvent être spécifiés avec //unc/<path>). // les chemins sont réservés par la norme pour un comportement spécifique à l'implémentation, et le //<letter>/ la syntaxe pour échapper aux chemins Win32 est largement utilisée dans les environnements de compatibilité POSIX existants

  • heuristique pour reconnaître les chemins Win32 "nus" en tant que tels

  • recherche insensible à la casse pour les chemins Win32 et // chemins (la norme autorise-t-elle ce type de comportement spécifique à l'implémentation pour // chemins?).

Je ne sais pas comment cela se qualifie car je ne sais pas combien de cela a été mis en œuvre, mais je pensais que c'était une description utile et intéressante du problème.

5
mikeserv

Une autre application: Blender traite un leader // comme référence au répertoire du projet (le répertoire dans lequel le .blend le fichier est enregistré). Voici la page de manuel appropriée .

Cela est également vrai pour les systèmes d'exploitation non similaires à Unix (c'est-à-dire Windows).

5
wchargin

J'ai un vague souvenir que le //Host/path la notation a été utilisée sur AT&T SysV.3 dans le cadre de son implémentation RFS Remote File Sharing . Cela a finalement été abandonné au moment de la sortie de SysV.4 en faveur du plus simple mais plus populaire NFS de Sun Microsystems.

Cependant, je ne trouve aucune référence concrète à la syntaxe, et la documentation que j'ai revue tout à l'heure semble indiquer que l'idée que l'utilisateur spécifie explicitement un nom d'hôte distant aurait été opposée au principe de conception de l'indépendance de l'emplacement.

Références 1. RFS Architectural overview

4
roaima

Dans les années 80, SEL/Gould avait un système d'exploitation Unix appelé UTX-32 dans lequel //Host/path était équivalent à /net/Host/path dans Solaris; c'est-à-dire, chemin d'accès à distance path sur l'hôte Host. Je ne trouve aucune documentation à ce sujet, donc je ne sais pas s'il s'agissait de RFS ou d'une évolution parallèle (ou si AT&T a volé acquis de Gould).

4
Scott

POSIX indique dans le Justification pour la résolution de chemin A.4.12 Paragraphes 9 et 10:

Dans certains systèmes en réseau, la construction /../hostname/ est utilisée pour faire référence au répertoire racine d'un autre hôte, et POSIX.1 autorise ce comportement.

D'autres systèmes en réseau utilisent la construction // hostname dans le même but; c'est-à-dire qu'une double barre oblique initiale est utilisée.

Cela semble confirmer que // signifie "racine du réseau", ou du moins c'était l'idée lorsque la règle a été incluse dans POSIX.


Les règles suivent pour supprimer toute signification de // au milieu d'un chemin pour un / a commencé Pathname:

... puisque les séquences non principales de deux caractères <slash> ou plus
sont traités comme une seule <barre oblique>, ...

Bien sûr, un // a commencé Pathname peut étendre ou modifier l'utilisation de // à l'intérieur d'un chemin d'accès (pas au début). POSIX.1 le permet. Ce dernier confirme que le seul // autorisé sont au début d'un chemin d'accès.

4
user79743