Pregunta

Tengo un sistema de construcción de la herramienta que está utilizando getcwd() para obtener el directorio de trabajo actual.Eso está muy bien, excepto que a veces las personas tienen espacios en sus caminos, que no es compatible con el sistema de construcción.Usted podría pensar que usted podría hacer un enlace simbólico:

ln -s "Directory With Spaces" DirectoryWithoutSpaces

Y, a continuación, ser feliz.Pero, por desgracia para mí, getcwd() resuelve todos los enlaces simbólicos.Traté de usar getenv("PWD"), pero no se señala en el mismo camino que vuelvo de getcwd().Yo la culpa make -C para la actualización de la variable de entorno, creo.Ahora, getcwd() me da la espalda a una ruta como esta:

/Users/carl/Directory With Spaces/Some/Other/Directories

Y getenv("PWD") me da:

/Users/carl/DirectoryWithoutSpaces

Así que, ¿hay alguna función como getcwd() que no resuelve los enlaces simbólicos?

Editar:

He cambiado

make -C Some/Other/Directories

a

cd Some/Other/Directories ; make

Y, a continuación, getenv("PWD") obras..Si no hay otra solución, puedo usar eso.

¿Fue útil?

Solución

De acuerdo a la Programación Avanzada en el Entorno UNIX biblia por Stevens, p.112:

Ya que el kernel debe mantener conocimiento del directorio de trabajo actual, debemos ser capaces de recuperar su valor actual.Por desgracia, todo el núcleo se mantiene para cada proceso es el i-nodo y número de identificación del dispositivo para el directorio de trabajo actual.El kernel no mantener la ruta de acceso completa del directorio.

Lo siento, parece que no necesita trabajar alrededor de esto en otra forma.

Otros consejos

No hay manera de que getcwd() para determinar la ruta que ha seguido a través de los enlaces simbólicos.La implementación básica de getcwd() estadísticas de la actual directorio '.'y, a continuación, abre el directorio padre '..'y exploraciones de las entradas hasta que encuentre el nombre del directorio con el mismo número de inodo como '.'ha.A continuación, repite el proceso hacia arriba hasta que se encuentra el directorio raíz, momento en el que tiene la ruta de acceso completa.En ningún momento se hace cada vez atravesar un enlace simbólico.Por tanto, el objetivo de tener getcwd() calcular la trayectoria seguida a través de los enlaces simbólicos es imposible, si se implementa como una llamada al sistema o como una función de la librería.

La mejor solución es asegurarse de que el sistema de generación de identificadores de nombres de ruta de acceso que contiene espacios.Eso significa que citar los nombres de ruta pasa a través de la cáscara.Los programas en C no se preocupan por los espacios en el nombre;es sólo cuando un programa como el shell interpreta las cadenas que ejecutar en problemas.(Compiladores implementado como shell scripts que se ejecutan los pre-procesadores a menudo tienen problemas con los nombres de ruta que contienen espacios en blanco - habla de la experiencia.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top