2009-11-14 8 views

Respuesta

11

No puede obtener el nombre de archivo exactamente como entrada; el shell manejará todas las cosas de redirección sin decírtelo.

En el caso de un cambio de dirección < file directa, puede recuperar una ruta de archivo asociado con la entrada estándar mediante el uso de fstat para obtener un número de i-nodo para que luego caminar la jerarquía de archivos de manera similar a find/-inum para obtener un camino que coincide con ella. (Puede haber más de un archivo de ruta debido a los enlaces).

Pero nunca deberías necesitar hacer esto. Como han dicho otros, si necesita conocer los nombres de los archivos, debe tomar los nombres de los archivos como argumentos.

+3

La operación 'recuperar una ruta de archivo' es probable que sea extremadamente cara - por partida doble por lo que si usted tiene una gran cantidad de sistemas de archivos montados en NFS para escanear. Además, como se indica, puede que no le dé una respuesta; las conexiones de tubería, por ejemplo, simplemente no tienen un nombre en el sistema de archivos. –

+0

Sí, de hecho. Es un perder todo. – bobince

4

¿Por qué quieres hacer esto? Todo su programa a.out se pasa desde el shell, es un descriptor de archivo abierto, stdin.

El usuario puede así hacer esto:

cat inpfilename | ./a.out 

y ahora no tienen absolutamente ningún nombre de archivo a utilizar (excepto/dev/stdin).

Si a.out necesita trabajar con nombres de archivos, ¿por qué no tomar el archivo como un argumento de línea de comandos?

2

Solo el shell principal lo sabrá. El programa, a.out siempre lo verá como stdin.

1

Su sistema operativo proporcionará a su programa la entrada desde este archivo. Esto es transparente para su programa y, como tal, no puede ver el nombre del archivo. De hecho, en algunas circunstancias, se le alimentó de entrada que no provienen de un archivo, como este:

ls | ./a.out 

lo que buscas es muy específica del sistema. Probablemente una mejor solución es pasar el nombre del archivo como parámetro. De esta forma, obtiene el nombre de archivo y puede abrirlo para leer el contenido.

0

Como usted dice, el proceso que ejecuta a.out no tiene noción del nombre de archivo del archivo que proporciona su 'entrada estándar'.

La invocación debe ser:

$ ./a.out inputfilename 

y analizar argv en int main(int argc, char* argv[]) { ... }

o

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

y obtener el nombre de archivo de la entrada estándar.

Luego en a.c necesita fopen ese archivo para leer su contenido.

0

No creo que sea posible, ya que < acaba de leer el contenido de inpfilename a STDIN.

Si desea que inpfilename esté disponible para su programa, pero también desea poder aceptar datos de STDIN, configure su programa para aceptar un argumento de nombre de archivo y enviarlo a un ARCHIVO. Si no se da ningún argumento, asigne STDIN a su ARCHIVO. Luego, su rutina de lectura de entrada usa funciones como fscanf en lugar de scanf, y el ARCHIVO que pasa es un enlace al archivo modificado o STDIN.

0

Un fstat(0,sb) (0 es el descriptor de fichero stdin) le dará detalles sobre el archivo de entrada, el tamaño, permisos (llamados modo) y i-nodo del dispositivo en el que reside.

De todos modos usted no será capaz de decirle a su paso: como ínodos UNIX tienen ni idea de cuál es el camino al que pertenecen, y técnicamente (ver ln) que podrían pertenecer a más de un camino.

0

día G,

Como se señaló en la respuesta anterior todo lo que ves es la entrada estándar descriptor de fichero abierto.

Si realmente desea hacer esto, puede especificar que la primera línea del archivo de entrada debe ser el nombre del archivo en sí.

HTH

Cuestiones relacionadas