Perché "Everything is a file" è unico per i sistemi operativi Unix?


70

Sento spesso la gente dire "La filosofia unica di Unix è che tratta tutto come un file" o "In Unix, tutto è un file". Ma non ho mai sentito nessuno spiegare perché è unico per Unix.

Quindi, perché questo è unico per Unix? Altri sistemi operativi come Windows e Mac non funzionano sui file?

Ed è unico rispetto ad altri sistemi operativi?


26
sidenote: macosx gira su un unix.
Akira,

2
prima, mentre roba di livello superiore non usa file (proprio come dbus o X in * nix) Windows di basso livello è costruito attorno agli handle. Puoi fare lo stesso con loro come file su * nix (apri, chiudi, controlla e di solito invia / ricevi), ma devi essere un programmatore per vedere quell'interfaccia. Se questa è una buona cosa è una questione di preferenza.
Segna il

1
tutto è un file, tranne le interfacce di rete.
alvin,

8
@akira - OSX è certificato Unix e non funziona "sopra di esso".
Rob,

1
@akira Non in cima a un Unix. OSX è uno dei pochi sistemi operativi UNIX certificati.
Let_Me_Be

Risposte:


53

Quindi, perché questo è unico per Unix?

I sistemi operativi tipici, prima di Unix, trattavano i file in un modo e trattavano ogni dispositivo periferico in base alle caratteristiche di quel dispositivo. Cioè, se l'output di un programma è stato scritto su un file su disco, quello era l'unico posto in cui l'output poteva andare; non è stato possibile inviarlo alla stampante o all'unità nastro. Ogni programma doveva essere a conoscenza di ogni dispositivo utilizzato per input e output e avere opzioni di comando per gestire dispositivi I / O alternativi.

Unix tratta tutti i dispositivi come file, ma con attributi speciali. Per semplificare i programmi, input standard e output standard sono i dispositivi di input e output predefiniti di un programma. Quindi l'output del programma normalmente destinato alla schermata della console potrebbe andare ovunque, su un file su disco o su una stampante o una porta seriale. Questo è chiamato redirezione I / O .

Altri sistemi operativi come Windows e Mac non funzionano sui file?

Naturalmente tutti i moderni sistemi operativi supportano vari filesystem e possono "operare su file", ma la distinzione è come vengono gestiti i dispositivi? Non conosco Mac, ma Windows offre un certo reindirizzamento I / O.

E, rispetto a quali altri sistemi operativi è unico?

Non proprio più. Linux ha la stessa funzione. Naturalmente, se un sistema operativo adotta il reindirizzamento I / O, tende a utilizzare altre funzionalità di Unix e alla fine diventa simile a Unix.


29
OS X è fondamentalmente Unix, quindi non c'è molta differenza.
Slhck,

6
c'è un po 'di più in tutto un modello di file.
artistoex,

1
Il paragrafo di apertura semplicemente non è vero. Prima di Unix esistevano sistemi operativi e in seguito avevano trovato funzionalità in Unix, incluso il reindirizzamento I / O.
Patrick Seymour,

3
Il piano 9 ha lo stesso concetto Tutto è un concetto di file ed è stato persino chiamato "più unix poi unix"
William

2
Windows (dal momento che NT) va un po 'più lontano. Esistono molti dispositivi che si comportano come file, come porte seriali e pipe denominate. Puoi scrivere a tutti usando WriteFile. Inoltre, esiste una categoria ancora più ampia di "oggetti di sincronizzazione" che include non solo i file ma anche i mutex.
MSalters il

34

L'idea che "tutto è un file" è nata da Multics. I progettisti di Unix hanno basato molto del loro lavoro su predecessori, in particolare Multics. In effetti, molte cose nel campo dell'informatica si basano su predecessori.

Puoi leggere di più sul lavoro di Dennis Ritchie nel design di Unix. Ha fatto riferimento a cose che hanno "copiato" da Multics, come il file system ad albero, la shell dei comandi e la non strutturazione dei file. Non sto insinuando che la gente di Unix abbia rubato alla gente di Multics. A tutti gli effetti, era la stessa gente.


6
questa non dovrebbe essere la risposta più votata, non risponde alla domanda, chiede semplicemente alle persone di porre un'altra domanda: "Perché è 'Tutto è un file' in Multics?"
Lie Ryan

13
@LieRyan: In realtà risponde alla domanda perché è unica : non lo è.
Goran Jovic,

1
La gente di Unix ha portato con sé le proprie idee quando il progetto Multics è stato interrotto e ribattezzato. Unix è solo un gioco di parole - uno contro molti.
Fiasco Labs,

2
@Lie Ryan - La domanda non era perché tutto è un file, è perché è unico. Come abbiamo sottolineato Goran e io, non lo è.
Patrick Seymour,

1
La domanda si riferisce in realtà al "sistema operativo Unix s ", vale a dire la famiglia. Quella famiglia include ragionevolmente Multics e Linux.
MSalters il

28

Unico? No. Definire? Assolutamente.

Avere tutto come file o dispositivo in una gerarchia nota significa che puoi usare lo stesso set di strumenti per tutto. Plan 9 di Bell Labs si spinge oltre con dispositivi hardware come file.

Ancora più importante, ciò consente due concetti molto semplici e potenti. Programmi di utilità di base che eseguono One Thing Well (tm), che possono essere collegati insieme ai tubi, se necessario. Vuoi trovare qualcosa in un file di testo? Usa catper mostrarlo, passalo grepe stai cucinando con il gas. Questo è il vero potere del modo "Unix": applicazioni specializzate che lavorano insieme per enormi quantità di flessibilità.

Anche Mac OS X segue la filosofia Unix, ma è meglio nascosto (un bundle 'application' è davvero una directory piena di file), e in effetti è un vero e proprio Unix certificato, discendente da NeXT , che utilizzava bit di FreeBSD .

Con Windows, ci sono alcuni componenti binari come il Visualizzatore eventi e il registro da allora, e ci sono alcuni vantaggi di velocità lì, in quel particolare scenario.


1
Più 1 per menzionare il piano 9. IMHO Fuse avvicina il piano 9 a un'implementazione tramite ad hoc e iterazione.
Danny Staple,

2
Bene, il piano 9 è il piano 9, in qualche modo funziona già. Fuse consente solo l'espansione del filesystem nello spazio utente in modi interessanti. Mi piace quello in cui IRC è trattato come un FS.
Journeyman Geek

Hmm - sai, ho intenzione di cercarlo per anni da quando l'ho scoperto attraverso un libro di Eric Raymond anni fa ... In realtà mi hai finalmente superato la gobba "aggirati", l'ho scaricato l'ISO e provarlo.
Danny Staple,

2
Credo che ci sia anche una versione più recente, chiamata inferno
Journeyman Geek

1
+1 per aver notato che Darwin di OS X è anche un "vero Unix".
calum_b,

18

A causa dei file speciali. Quando la gente dice "tutto è un file in Unix", i file e le directory comuni non sono ciò che hanno in mente. I file speciali sono univoci per i sistemi operativi simili a Unix, di cui ce ne sono molti. Quindi non è unico per l'Unix.

I file speciali servono a molti scopi. Esistono tubi, prese e, in particolare, file di dispositivi. Tubi e prese sono flussi di comunicazione tra i processi. Gran parte della funzionalità dei sottosistemi è resa disponibile nello spazio utente attraverso i file del dispositivo.

Tubi e prese

I programmi li usano proprio come farebbero con i normali file. In effetti, il più delle volte non gliene importa nemmeno quale tipo di file utilizzino. Ecco perché i comandi Unix possono essere combinati in modo così ampio per formare nuovi potenti sistemi. (Vedi reindirizzamento I / O nella risposta della segatura)

File dispositivo

Come accennato in precedenza, queste agiscono come interfacce per lo spazio utente. Ad esempio, per espellere il vassoio cd, un programmatore dovrebbe prima aprire il file del dispositivo corrispondente. Un altro esempio: vuoi che il tuo programma passi al terminale virtuale. Apri prima / dev / console.

Quello che succede dopo non è l'invio di semplici personaggi di quei file, ma l'emissione di ioctl () 's su di loro. I singoli ioctl che è possibile emettere dipendono dal dispositivo. Ad esempio, la console è documentata in console_ioctl (4)


12

Probabilmente sarò alesato per aver detto questo, ma penso che dire che tutto sia un file in Unix sia in realtà un errore. Ciò che è veramente sono due cose.

  1. File e dispositivi (e molte altre cose) sono oggetti che possono essere modellati da un'interfaccia che comprende funzioni di apertura, chiusura, lettura, scrittura e controllo (ioctl).
  2. Lo spazio dei nomi per questi oggetti è gerarchico, ovvero questi oggetti sono organizzati in una gerarchia.

Un filesystem implementa questo spazio dei nomi e implementa il framework che consente l'invio di funzioni di interfaccia a questi oggetti. Un filesystem fu inizialmente concettualizzato per ospitare i file, ma fu poi cooptato per organizzare altri oggetti nella gerarchia dello spazio dei nomi. Un esempio di polimorfismo di prima orientato agli oggetti era una cosa.

Non c'è nulla di male nel chiamare tutti i file. Ma in realtà sono questi oggetti più generici (un file è uno di questi oggetti). Da questa prospettiva, questa idea non è affatto unica per Unix. Molti altri sistemi operativi implementano tali gerarchie di oggetti polimorfici.


Esattamente! In Unix tutto è un descrittore di file (non necessariamente un file!), Ovvero tutto (tranne la memoria) è I / O, anche i file. È necessario accedere ai file come se fossero flussi di I / O (anche se sono cercabili, quindi in qualche modo accessibili in modo casuale, ma che il costo estremo delle chiamate di sistema extra). (con l'eccezione di quel poco che si può fare mmap()ovviamente ...)
Greg A. Woods,

9

Quando la gente dice "In Unix, tutto è un file", ciò significa che anche le cose che non sono file vengono trattate come file.

Naturalmente la maggior parte dei sistemi operativi funziona con i file. File di testo, file di immagine, file audio. Ma non tutti i sistemi operativi trattano i dispositivi come file. Questa è una differenza importante. Se elenco il contenuto della mia cartella / dev / nel mio sistema operativo Ubuntu (che è basato su Unix), ottengo un elenco di oltre 200 dispositivi. Alcuni di questi dispositivi sono hardware, ma sono mostrati all'interno di una cartella. Ad esempio dischi rigidi, porte USB, mouse e tastiera, dispositivi audio e stampanti, tra gli altri. Alcuni dei dispositivi sono virtuali, ad esempio / dev / urandom, che si comporta come un file infinito pieno di numeri casuali. Non è un vero file sul mio disco rigido.

Tutti questi dispositivi sono trattati come file. Riesco a leggere dati da e / o scrivere dati in quei dispositivi. Qui ci sono esempi di copia dei dati da diversi dispositivi nel dispositivo audio. Questo è possibile perché sono trattati come file. Il risultato (geek) è la capacità di ascoltare il contenuto del disco rigido, il movimento del mouse, la memoria del computer o i pixel di un'immagine. Ciò sarebbe molto più difficile da ottenere se i dispositivi non fossero trattati come file, poiché ciascun dispositivo richiederebbe metodi diversi per leggere e scrivere i dati.

Detto questo, ciò che significa "tutto" varia da sistema a sistema. Ad esempio, OS X è basato su Unix, ma non ha un dispositivo / dev / audio. Utilizza un sistema audio proprietario chiamato CoreAudio. Quindi in questo caso si potrebbe dire "quasi tutto è un file". Quindi, in sistemi come Windows, in cui "tutto non è un file", potresti comunque fare cose come copiare il contenuto di un file sulla porta della stampante (digitando qualcosa di simile copy mydocument.txt >lpt1:), che è simile alla copia di un documento sul dispositivo della stampante in Unix sistemi.

Altri sistemi operativi come Windows e OS X non funzionano sui file? Si lo fanno. Windows e OS X funzionano su file, ma Windows non tratta i dispositivi come file, il che fa parte del significato di "tutto è un file".


8

Vedo Multics citato come la fonte di "tutto è un file", ma penso che tu debba guardare un po 'più in profondità dei soli file di dispositivo, named pipe, file regolari, ecc. Ecc. Devi guardare la sintassi dei nomi dei file. Ciò fa una grande differenza anche quando esistono "nomi di file magici" di AUX, CON e LP.

Vedi " Il nome orribile " di Rob Pike. Confronta la sintassi di denominazione dei file Unix con un paio di altre sintassi, in particolare VMS. Si noti che i sistemi operativi mainframe della fine degli anni '60 / primi anni '70, quando nacque Unix, avevano ciò che la mente moderna considererebbe straordinariamente sintassi di denominazione dei file rococò. Sono passati anni da quando ho usato VM / CMS, o NOS o NOS / VE, e ho solo guardato dietro le spalle di qualcuno che utilizza un sistema operativo Univac, ma è sufficiente dire che le stranezze sono state più numerose delle regolarità.

Non ho mai visto Multics in esecuzione, ma puoi vedere un documento sul suo file system . Sembra che Unix originale abbia preso "tutto è un file" un po 'oltre rispetto a Multics, ma il tuo chilometraggio può variare.


1
Bene, in Multics tutto è memoria, tranne l'I / O (anche se può essere mappato anche sulla memoria). In Unix tutto (tranne la memoria) è un descrittore di file , inclusi i file. Cioè in Unix tutto è I / O.
Greg A. Woods,

1
A proposito, ora esiste un emulatore che avvierà ed eseguirà Multics.
Greg A. Woods,

3

Si noti che anche Linus Torvalds non è d'accordo con il fatto che "tutto è un file". Se cerchi "

tutto è un bystestream

"troverai interessanti filosofie su come intendiamo che tutto non è un file, ad esempio una struttura di dati astratta nella memoria o un puntatore non è sicuramente un file, OK sicuramente tutto può essere rappresentato come un file ma rappresentare ed essere sono 2 azioni diverse .


1
Non hai fornito un link. In alcune ricerche, ho trovato yarchive.net/comp/linux/everything_is_file.html , citando le risposte di Torvald in un thread di posta elettronica, in cui afferma implicitamente che il modello dovrebbe essere "tutto è un file".
bgvaughan,

1
In realtà @bgvaughan è il contrario: yarchive.net/comp/linux/everything_is_file.html fornisce la citazioneThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
Piccola foresta antica Kami

1
@LIttleAncientForestKami: e Unix tradizionalmente tratta i file come semplici flussi di byte, al contrario dei sistemi che trattavano i file come flussi di record (o avevano entrambi flussi di byte e flussi di record), come raccolte di flussi (o fork di risorse), o avevano modelli più complessi, in cui esistevano diversi modi per accedere a diversi tipi di oggetti.
ninjalj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.