2016-04-04 6 views
1

Ich habe ein Programm, das aktuelle Verzeichnis zu drucken, die ich vonget_cwd() aus verknüpften Verzeichnis

bekam

How to get the current directory in a C program?

, die sehr gut funktioniert.

Wie kann ich dies jedoch für einen verbundenen Verzeichnis tun?

Zum Beispiel, ich brauche

/home/user/Directory 

anstelle des verknüpften Verzeichnis

/mnt/data/user/Directory 

das heißt,

lrwxrwxrwx 1 user user 23 Apr 2 2015 Directory -> /mnt/data/user/Directory// 

im Gegensatz zu

drwxrwxrwx 1 user user 23 Apr 2 2015 Directory 

Ich versuche meine C-Fähigkeiten zu erweitern, vielleicht gibt es etwas, das mir fehlt?

+0

ein absolutes Verzeichnis? – user8

+0

Möchten Sie den Pfad erhalten, auf den ein Symlink zeigt? Das kannst du mit readlink (2) machen. –

+0

@AndySweig: Es ist klar, dass die OP nicht den Pfad bekommen will, auf den ein Symlink zeigt. – sjsam

Antwort

2

Ich denke, ich verstehe die Situation jetzt. Korrigiere mich, wenn ich falsch liege. Du bist zu diesem Verzeichnis gekommen, indem du /home/user/Directory hast. Dort angekommen, führen Sie Ihr Programm und getcwd gibt /mnt/data/user/Directory zurück, aber was Sie wollen, ist /home/user/Directory. Ist es das? Wenn dies der Fall ist, weiß das System nicht, dass Sie zu diesem Verzeichnis gelangt sind, indem Sie einem Symlink gefolgt sind, so dass es Ihnen /home/user/Directory nicht geben kann. Die meisten Shells setzen jedoch die Umgebungsvariable PWD auf das aktuelle Verzeichnis, wie durch das, zu dem Sie cd'ing, PWD wird wahrscheinlich /home/user/Directory nach cd'ing in diesem Verzeichnis. Ich bin mir nicht sicher, ob das in Ihrer Situation hilft.

+0

Das ist grundsätzlich richtig. Nachschlagen ['cd'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html) in POSIX. Die Optionen '-P 'und' -L' geben den physikalischen und logischen Verzeichnisnamen an. Die '-P'-Option funktioniert wie' realpath() 'oder' getcwd() 'und berechnet den direkten Pfad vom Stammverzeichnis zum angegebenen/aktuellen Verzeichnis. Die Option "-L" erfordert Shell-Unterstützung. Die Shell muss sich daran erinnern, wie sie zum aktuellen Verzeichnis gelangt ist, und sie verwendet die gespeicherten Informationen, um dorthin zurückzukehren, wo sie hergekommen ist. –

0

Dies ist eine Demo, aber nicht mit viel Fehlerüberprüfung:

#include<stdio.h> 
#include<unistd.h> 
#include<sys/stat.h> /* For retrieving file stats */ 
#include<sys/types.h> 
#include<stdlib.h> 


int main() 
{ 

struct stat info; 
char *target; 
char *const ptr=getenv("PWD"); 

printf("Current working directory : %s\n",ptr); 

/* Now, checking to see if your current directory is a link */ 

if(lstat(ptr,&info)==0) 
{ 
    if(S_ISLNK(info.st_mode)) 
    { 
    target=(char*)malloc((info.st_size+1)*sizeof(char)); 
    readlink(ptr,target,info.st_size+1); 
    target[info.st_size]='\0'; 
    printf("Current directory is a link\n"); 
    printf("Target directory : %s\n",target); 
    free(target); 
    } 
    else 
    { 
    printf("Current directory is not a link\n"); 
    } 
} 
else 
{ 
    printf("Sorry! Cannot stat the file\n"); 
    exit(-1); 
} 

return 0; 
} 
+0

Dies ist subvertierbar: 'PWD =/Epsilon/Delta/Gamma/Beta/Alpha env | grep PWD zeigt, dass 'PWD' auf einen beliebigen Wert gesetzt werden kann. –

+1

Es ist auch nicht völlig zuverlässig, auch wenn nicht direkt untergraben. Es erkennt, ob das letzte Element des Pfades ein Symlink ist, aber Zwischenelemente können ein Symlink sein. Gegeben sei ein echtes Verzeichnis '/ home/person/subdir1', das ein anderes reales Verzeichnis'/home/person/subdir1/leafdir' und einen symbolischen Link '/ home/person/subdir2' enthält, der' subdir1' referenziert, und der Benutzer 'tut cd/home/person/subdir2/leafdir', dann meldet Ihr Code 'kein Link', obwohl ein symbolischer Link durchschritten wurde, um zu 'leafdir' zu gelangen. –

+0

@ JonathanLeffler: Danke, dass Sie darauf hingewiesen haben, dass 'PWD' subvertierbar ist. Aber zu überprüfen, ob ein symbolisches Verzeichnis durchsucht wurde, um zum aktuellen Verzeichnis zu gelangen, ist kein Teil von ops Mission. – sjsam

Verwandte Themen