2010-07-17 21 views
4

J'ai un outil de système de construction qui utilise getcwd() pour obtenir le répertoire de travail actuel. C'est génial, sauf que parfois les gens ont des espaces dans leurs chemins, ce qui n'est pas supporté par le système de construction. Vous penseriez que vous pourriez simplement faire un lien symbolique:Que puis-je faire si getcwd() et getenv ("PWD") ne correspondent pas?

ln -s "Directory With Spaces" DirectoryWithoutSpaces 

Et puis soyez heureux. Mais malheureusement pour moi, getcwd() résout tous les liens symboliques. J'ai essayé d'utiliser getenv("PWD"), mais il ne pointe pas sur le même chemin que je reviens de getcwd(). Je blâme make -C pour ne pas mettre à jour la variable d'environnement, je pense. En ce moment, getcwd() me donne de nouveau un chemin comme celui-ci:

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

Et getenv("PWD") me donne:

/Users/carl/DirectoryWithoutSpaces 

donc - est-il une fonction comme getcwd() qui ne résout pas les liens symboliques?

Edit:

J'ai changé

make -C Some/Other/Directories 

à

cd Some/Other/Directories ; make 

Et puis getenv("PWD") œuvres .. S'il n'y a pas d'autre solution, je peux l'utiliser.

+0

Quelle partie de votre programme ne fonctionne pas parce qu'ils sont des espaces dans un chemin? – eruciform

+1

'mv ~ /" Répertoire avec espaces "~/DirectoryWithoutSpaces'? : P – muhmuhten

+1

@eruciform, l'outil en question génère un tas de fichiers makefile; pour beaucoup de raisons, il s'étouffe s'il y a des espaces dans ce chemin. J'ai fait les changements mentionnés dans mon édition, et je corrige maintenant le problème d'espaces dans son ensemble, mais indépendamment de cela, c'est un peu bizarre de générer les makefiles avec un mélange de liens symboliques et de noms de chemins résolus. L'édition que j'ai ci-dessus corrige cela, mais je suis toujours intéressé par des solutions alternatives. –

Répondre

6

Selon la programmation avancée dans la Bible environnement UNIX par Stevens, p.112:

Comme le noyau doit maintenir la connaissance du répertoire de travail actuel, nous devrions être en mesure de récupérer sa valeur actuelle. Malheureusement, tout le noyau maintient pour chaque processus le numéro d'i-noeud et l'identification du périphérique pour le répertoire de travail courant. Le noyau ne conserve pas le chemin complet du répertoire.

Désolé, il semble que vous ayez besoin de contourner ce problème d'une autre manière.

+1

C'est très triste. Mais j'ai un système qui fonctionne maintenant. –

+0

ouais, désolé. J'espère que la réponse a aidé. – eruciform

+0

autant que toute réponse est susceptible de, semble-t-il. La solution de contournement dans mon édition est ok pour moi. Merci! –

3

Il n'y a aucun moyen pour getcwd() de déterminer le chemin que vous avez suivi via des liens symboliques. L'implémentation de base de getcwd() stocke le répertoire en cours '.', puis ouvre le répertoire parent '..' et analyse les entrées jusqu'à ce qu'il trouve le nom de répertoire ayant le même numéro d'inode que '.'. Il répète ensuite le processus vers le haut jusqu'à ce qu'il trouve le répertoire racine, à quel point il a le chemin complet. A aucun moment, il ne traverse un lien symbolique. L'objectif de getcwd() de calculer le chemin suivi par les liens symboliques est donc impossible, qu'il soit implémenté en tant qu'appel système ou en tant que fonction de bibliothèque.

La meilleure solution consiste à s'assurer que le système de construction gère les noms de chemin contenant des espaces. Cela signifie que les chemins d'accès sont passés à travers le shell. Les programmes C ne se soucient pas des espaces dans le nom; C'est seulement quand un programme comme le shell interprète les chaînes que vous rencontrez des problèmes. (Les compilateurs implémentés comme scripts shell qui exécutent des pré-processeurs ont souvent des problèmes avec les noms de chemins contenant des espaces - par expérience.)

+0

Oui - clairement 'getcwd()' ne fonctionnera pas. J'espérais trouver une alternative qui serait - mon montage en montre un. Faire en sorte que le système de construction gère les espaces est un cauchemar total - GNU make est notoirement mauvais pour les manipuler. Je pense qu'il sera plus facile de prendre les exigences absolues, mais toujours pas de pique-nique. –