GNU/Linux >> Linux Esercitazione >  >> Linux

Portabilità dei collegamenti del descrittore di file?

Me lo sono sempre chiesto, ma non ho mai avuto il tempo di scoprirlo, quindi lo farò ora:quanto è portatile l'utilizzo mostrato qui di /proc/$$/fd/$N o /dev/fd/$N ? Comprendo che POSIX garantisce /dev/null, /dev/tty, and /dev/console (anche se l'ho scoperto solo l'altro giorno dopo aver letto i commenti su questa risposta) ma che dire di questi altri?

Per quanto posso dire sono piuttosto comuni, ma in quali sistemi posso non aspetti di trovarli? Perchè no? È più probabile trovarne uno rispetto all'altro? Mostreranno sempre attributi simili?

Tendo a utilizzare questi dispositivi in ​​modo abbastanza estensivo in tutti i modi e vorrei sapere se c'è la possibilità di non riuscire a provare.

Anche le domande di cui sopra dovrebbero essere intese come solo ciò che penso Mi piacerebbe saperlo, ma, dato che ovviamente devo chiedere in primo luogo, potrei non saperlo meglio al riguardo e non dovrebbero essere considerati requisiti stringenti per una risposta. Indicami solo se puoi, per favore.

Risposta accettata:

Il /proc/PID/fd/NUM i collegamenti simbolici sono quasi universali su Linux, ma non esistono da nessun'altra parte (tranne su Cygwin che li emula). /proc/PID/fd/NUM esistono anche su AIX e Solaris, ma non sono collegamenti simbolici. In modo portatile, per ottenere informazioni sui file aperti, installa lsof .

Unices con /proc/PID/fd

Linux

Sotto Linux, /proc/PID/fd/NUM è un collegamento simbolico leggermente magico al file che il processo con l'ID PID è aperto nel descrittore di file NUM . Questo collegamento è magico in quanto, ad esempio, può essere utilizzato per accedere al file anche se il file viene rimosso. Il collegamento traccerà anche il file tramite rinomina. /proc/self è un collegamento simbolico magico che punta a /proc/PID dove PID è il processo che accede al collegamento.

Questa funzionalità è presente praticamente su tutti i sistemi Linux. È fornito dal driver per il filesystem proc, che è tecnicamente opzionale ma utilizzato per molte cose (incluso creare il ps lavoro — legge da /proc/PID ) che non viene quasi mai escluso anche sui sistemi embedded.

Cygwin

Cygwin emula il /proc/PID/fd/NUM (per i processi Cygwin) e /proc/self .

Solaris (dalla versione 2.6), AIX

Ci sono /proc/PID/fd voci per ciascun descrittore di file, ma appaiono dello stesso tipo del file aperto, quindi non forniscono informazioni sul percorso del file. Tuttavia riportano lo stesso stat informazioni come fstat segnalerebbe al processo che ha il file aperto, quindi è possibile determinare su quale filesystem si trova il file e il suo numero di inode. Le directory appaiono come collegamenti simbolici, tuttavia sono collegamenti simbolici magici che possono essere solo seguiti e readlink restituisce una stringa vuota.

Sotto AIX, i procfiles comando visualizza alcune informazioni sui file aperti di un processo. Sotto Solaris, i pfiles comando visualizza alcune informazioni sui file aperti di un processo. Questo non include il percorso del file (su Solaris lo fa da Solaris 10, vedi sotto).

Solaris (dalla versione 10)

Oltre a /proc/PID/fd/NUM , le versioni moderne di Solaris hanno /proc/PID/path/NUM che contiene collegamenti simbolici simili ai collegamenti simbolici di Linux in /proc/PID/fd/NUM . I pfiles comando mostra le informazioni sui file aperti di un processo, inclusi i percorsi.

Pianifica9

/proc/PID/fd è un file di testo che contiene un record (riga) per descrittore di file aperto dal processo. Il nome del file non viene tracciato lì.

Correlati:estrarre il nome del file dal percorso nel programma awk?

QNX

/proc/PID/ è una directory, ma non contiene alcuna informazione sui descrittori di file.

Unices con /proc ma nessun accesso diretto ai descrittori di file

(Nota:a volte è possibile ottenere informazioni sui file aperti di un processo sfogliando la sua immagine di memoria, accessibile in /proc . Non lo considero come "accesso diretto".)

Unices dove /proc/PID è un file

Il filesystem proc stesso è iniziato in UNIX 8a edizione, ma con una struttura diversa, ed è passato attraverso Plan 9 e torna ad alcuni UNIX. Penso che tutti i sistemi operativi con un /proc hanno una voce per ogni PID, ma su molti sistemi è un file normale, non una directory. I seguenti sistemi hanno un /proc/PID che deve essere letto con ioctl :

  • Solaris fino a 2,5
  • OSF/1 ora noto come Tru64
  • IRIX (?)
  • SCO (?)

MINIX 3

MINIX 3 ha un server procfs che fornisce diversi componenti simili a Linux tra cui /proc/PID/ directory. Tuttavia non esiste un /proc/PID/fd .

FreeBSD

FreeBSD ha /proc/PID/ directory, ma non forniscono informazioni sui descrittori di file aperti. (C'è comunque /proc/PID/file che è simile al /proc/PID/exe , dando accesso all'eseguibile tramite un collegamento simbolico.)

Il procfs di FreeBSD è deprecato.

Unices senza /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Informazioni sul descrittore di file tramite altri canali

Fusore

Il fuser comando elenca i processi che hanno un file specificato aperto o un file aperto nel punto di montaggio specificato. Questo comando è standard (disponibile su tutti i sistemi compatibili con XSI, ovvero POSIX con X/Open System Interface Extension).

Non puoi passare da un processo a nomi di file con questa utility.

Lsof

Lsof sta per "elenca i file aperti". È uno strumento di terze parti, disponibile (ma di solito non fa parte dell'installazione predefinita) per la maggior parte delle varianti Unix. L'ottenimento di informazioni sui file aperti dipende molto dal sistema, poiché l'analisi di cui sopra potrebbe aver fatto sospettare. Il manutentore lsof ha fatto il lavoro di combinare tutto sotto un'unica interfaccia.

Puoi leggere le FAQ per vedere che tipo di difficoltà deve affrontare lsof. Sulla maggior parte degli unice, ottenere informazioni sui nomi dei file aperti richiede l'analisi delle strutture dati del kernel. Citando dalla FAQ 3.3 "Perché lsof non segnala i nomi dei percorsi completi?":

Lsof non può ottenere componenti del nome del percorso dalle cache dei nomi del kernel dei seguenti dialetti:

  • AIX

Solo il kernel Linux registra i nomi di percorso completi nelle strutture che mantiene sui file aperti; invece, la maggior parte dei kernel converte i nomi dei percorsi in doppietti di numeri di nodi e dispositivi e li usa per i successivi riferimenti ai file una volta che i file sono stati aperti.

Se hai bisogno di analizzare le informazioni da lsof 's output, assicurati di utilizzare il -F mode (un campo per riga), preferibilmente il -F0 modalità (campi delimitati da null). Per ottenere informazioni su un descrittore di file specifico di un processo specifico, utilizzare il -a opzione con -p PID e -d NUM , per esempio. lsof -a -p 123 -d 0 -F0n .

/dev/fd/NUM per i descrittori di file del processo corrente

Molte varianti unix forniscono un modo per un processo per accedere ai suoi file aperti tramite un nome file:apertura /dev/fd/NUM equivale a chiamare dup(NUM) . Questi nomi sono utili quando un programma vuole un nome di file ma vuoi passare un file già aperto (ad esempio una pipe o un socket); per esempio le shell che implementano la sostituzione dei processi le usano dove disponibili (usando una named pipe temporanea dove /dev/fd non è disponibile).

Dove /dev/fd esiste, ci sono anche solitamente (sempre?) sinonimi (a volte link simbolici, a volte hard link, a volte file magici con proprietà equivalenti) /dev/stdin =/dev/fd/0 , /dev/stdout =/dev/fd/1 , /dev/stderr =/dev/fd/2 .

  • Sotto Linux, /dev/fd è un collegamento simbolico a /proc/self/fd .
  • Sotto la maggior parte degli unice (IRIX, OpenBSD, NetBSD, SCO, Solaris, …), le voci in /dev/fd sono dispositivi di carattere. Di solito vengono visualizzati indipendentemente dal fatto che il descrittore di file sia aperto o meno e le voci potrebbero non essere disponibili per descrittori di file superiori a un determinato numero.
  • Sotto FreeBSD e OSX, il filesystem fdescfs fornisce un /dev/fd dinamico directory che segue i descrittori aperti del processo chiamante. Un /dev/fd statico è disponibile se /dev/fd non è montato.
  • Sotto OSF/1 (Tru64), /dev/fd viene fornito tramite fdfs.
  • Non esiste /dev/fd su AIX o HP-UX.
Correlati:è possibile ottenere un carattere sul cursore del terminale utilizzando i codici di escape ANSI?
Linux
  1. Che cos'è Soft Links e Hard Links nel file system Linux

  2. Recupera il nome del file dal descrittore di file in C

  3. Come funzionano i limiti del descrittore di file Linux?

  4. Cos'è un file .pid e cosa contiene?

  5. Riciclaggio PID di Linux

Comando Ln in Linux (Crea collegamenti simbolici)

Spiegazione di hard link e soft link in Linux

Che cosa sono i collegamenti simbolici in Linux? Come creare collegamenti simbolici?

PID massimo in Linux

cp -L contro cp -H

Il modo più sicuro per forzare la chiusura di un descrittore di file