Pergunta

Eu tenho um sistema de compilação ferramenta que está usando getcwd() para obter o diretório de trabalho atual.Isso é ótimo, exceto que, por vezes, ter espaços em seus caminhos, que não é suportado pelo sistema de compilação.Você acha que você poderia apenas fazer um link simbólico:

ln -s "Directory With Spaces" DirectoryWithoutSpaces

E, em seguida, ser feliz.Mas, infelizmente para mim, getcwd() resolve todos os links simbólicos.Eu tentei usar getenv("PWD"), mas ele não está apontando para o mesmo caminho que eu voltar de getcwd().Acho que a culpa make -C para não atualizar a variável de ambiente, eu acho.Agora, getcwd() me dá de volta a um caminho como este:

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

E getenv("PWD") dá-me:

/Users/carl/DirectoryWithoutSpaces

Então existe alguma função como getcwd() isso não resolver os links simbólicos?

Editar:

Eu mudei

make -C Some/Other/Directories

para

cd Some/Other/Directories ; make

E, em seguida, getenv("PWD") funciona..Se não houver outra solução, eu posso usar esse.

Foi útil?

Solução

De acordo com a Programação Avançada em Ambiente UNIX, a bíblia por Stevens, p.112:

Desde que o kernel deve manter o conhecimento de que o diretório de trabalho atual, deve ser capaz de buscar o seu valor atual.Infelizmente, tudo o kernel mantém para cada processo i-número do nó e a identificação do dispositivo para o diretório de trabalho atual.O kernel não manter o nome do caminho completo do diretório.

Desculpe, parece que você precisa fazer para contornar isso de outra maneira.

Outras dicas

Não há nenhuma maneira para getcwd() para determinar o caminho que você seguiu através de links simbólicos.A implementação básica de getcwd() estatísticas do diretório atual '.'e, em seguida, abre o diretório pai '..'e verifica as entradas até encontrar o nome do diretório com o mesmo número de inode como '."tem.Em seguida, repete o processo para cima até encontrar o diretório raiz, em que ponto ele tem o caminho completo.Em nenhum ponto ela nunca atravessar um link simbólico.Assim, o objetivo de ter getcwd() calcular o caminho seguido através de links simbólicos é impossível, se ele é implementado como uma chamada de sistema ou como uma função de biblioteca.

A melhor resolução é garantir que o sistema de construção de alças de nomes de caminho que contenha espaços.Isso significa que citando caminhos passados através do shell.Programas em C não me importo sobre os espaços no nome;é só quando um programa como o shell interpreta as seqüências de caracteres que você executar em problemas.(Compiladores implementados como scripts de shell que executa pré-processadores muitas vezes têm problemas com caminhos que contêm espaços - falando da experiência.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top