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ì.
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.