2009-11-14 12 views

risposta

11

Non è possibile ottenere il nome file esattamente come input; la shell gestirà tutta quella roba di reindirizzamento senza dirvelo.

Nel caso di un < file reindirizzamento diretta, è possibile recuperare un percorso file associati a stdin utilizzando fstat per ottenere un numero di inode per esso poi a piedi la gerarchia dei file in modo simile a find/-inum per ottenere un percorso che corrisponde a esso. (Potrebbero esserci più di uno di questi percorsi di file a causa di collegamenti.)

Ma non dovresti mai aver bisogno di farlo. Come altri hanno già detto, se hai bisogno di conoscere i nomi dei file dovresti prendere i nomi dei file come argomenti.

+3

L'operazione 'recuperare un percorso file' è probabile che sia diabolicamente costosa - doppiamente così se si dispone di una pletora di file system NFS montati per eseguire la scansione. Inoltre, come indicato, potrebbe non darti una risposta; le connessioni di condotte, per esempio, semplicemente non hanno un nome nel file system. –

+0

Sì, davvero. È una perdita per tutti. – bobince

4

Perché vuoi farlo? Tutto il tuo programma a.out viene passato dalla shell, è un descrittore di file aperto, stdin.

L'utente potrebbe anche fare questo:

cat inpfilename | ./a.out 

e ora avete assolutamente alcun nome del file da utilizzare (ad eccezione di/dev/stdin).

Se a.out deve funzionare con i nomi di file, perché non utilizzare il file come argomento della riga di comando?

2

Solo la shell madre lo saprà. Il programma, a.out vedrà sempre come stdin.

1

Il sistema operativo fornirà il programma con input da questo file. Questo è trasparente per il tuo programma, e come tale non puoi vedere il nome del file. Infatti, in alcune circostanze vi sarà alimentato ingresso che non provengono da un file, come ad esempio questo:

ls | ./a.out 

quello che cercate è molto specifico sistema. Probabilmente una soluzione migliore è passare il nome del file come parametro. In questo modo ottieni il nome del file e puoi aprirlo per leggere il contenuto.

0

Come si inserisce il processo che esegue a.out non ha nozione del nome del file del file che fornisce il suo 'input standard.

L'invocazione dovrebbe essere:

$ ./a.out inputfilename 

e analizzare argv in int main(int argc, char* argv[]) { ... }

o

$ ./a.out <<< "inputfilename" 

E ottenere il nome del file da stdin.

Quindi in a.c è necessario il file fopen per leggere il suo contenuto.

0

Non credo sia possibile, poiché < legge il contenuto di inpfilename su STDIN.

Se si desidera che inpfilename sia disponibile per il proprio programma, ma si desidera anche essere in grado di accettare i dati da STDIN, impostare il programma in modo che accetti un argomento nomefile e fopen quello in un FILE. Se non viene fornito alcun argomento, assegna STDIN al tuo FILE. Quindi la tua routine di lettura degli input usa funzioni come fscanf piuttosto che scanf, e il FILE che hai passato è un link al file fopened o STDIN.

0

Un fstat(0,sb) (0 è descrittore di file standard input) vi darà i dettagli sul file di input, dimensioni, i permessi (chiamati modalità) e inode del dispositivo su cui risiede.

In ogni caso non sarà in grado di dire il suo percorso: come inode Unix non hanno idea di quale percorso a cui appartengono, e tecnicamente (vedi ln) potrebbero appartenere a più di un percorso.

0

G'day,

Come sottolineato nella risposta sopra tutto quello che vedete è lo stdin descrittore di file aperto.

Se si desidera eseguire questa operazione, è possibile specificare che la prima riga del file di input deve essere il nome del file stesso.

HTH

Problemi correlati