Domanda

Ho uno strumento di sistema di compilazione che sta utilizzando getcwd() per ottenere la directory di lavoro corrente.È fantastico, tranne per il fatto che a volte le persone hanno spazi nel loro percorso, il che non è supportato dal sistema di compilazione.Penseresti che potresti semplicemente creare un collegamento simbolico:

ln -s "Directory With Spaces" DirectoryWithoutSpaces

E poi sii felice.Ma sfortunatamente per me, getcwd() risolve tutti i collegamenti simbolici.Ho provato a usare getenv("PWD"), ma non indica lo stesso percorso da cui torno getcwd().io incolpo make -C per non aver aggiornato la variabile d'ambiente, credo.Proprio adesso, getcwd() mi restituisce un percorso come questo:

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

E getenv("PWD") mi da:

/Users/carl/DirectoryWithoutSpaces

Quindi, c'è qualche funzione simile getcwd() che non risolve i collegamenti simbolici?

Modificare:

Ho cambiato

make -C Some/Other/Directories

A

cd Some/Other/Directories ; make

Poi getenv("PWD") lavori..Se non c'è altra soluzione, posso usare quella.

È stato utile?

Soluzione

Secondo la programmazione avanzata nella Bibbia dell'ambiente UNIX da Stevens, P.112:

.

Poiché il kernel deve mantenere la conoscenza della directory di lavoro corrente, dovremmo essere in grado di recuperare il suo valore corrente.Sfortunatamente, tutto il kernel mantiene per ciascun processo è il numero I-nodo e l'identificazione del dispositivo per la directory di lavoro corrente.Il kernel non mantiene il percorso completo della directory.

Scusa, sembra che tu abbia bisogno di lavorare in questo modo in un altro modo.

Altri suggerimenti

Non c'è modo di farlo getcwd() per determinare il percorso che hai seguito tramite collegamenti simbolici.L'implementazione di base di getcwd() indica la directory corrente '.', quindi apre la directory principale '..' ed esegue la scansione delle voci finché non trova il nome della directory con lo stesso numero di inode di '.' ha.Quindi ripete il processo verso l'alto finché non trova la directory principale, a quel punto ha il percorso completo.In nessun momento attraversa mai un collegamento simbolico.Quindi l'obiettivo di avere getcwd() calcolare il percorso seguito tramite collegamenti simbolici è impossibile, sia che sia implementato come chiamata di sistema o come funzione di libreria.

La soluzione migliore è garantire che il sistema di compilazione gestisca i nomi di percorso contenenti spazi.Ciò significa citare i percorsi passati attraverso la shell.Ai programmi C non interessano gli spazi nel nome;è solo quando un programma come la shell interpreta le stringhe che si verificano problemi.(I compilatori implementati come script di shell che eseguono preprocessori spesso hanno problemi con i percorsi che contengono spazi, parlando per esperienza.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top