2011-06-24 8 views
0

アプリケーションでは、getcwd(3)を呼び出して現在の作業ディレクトリを取得します。getcwdがプロセスの作業ディレクトリを取得するための代替APIはありますか?

誰かがディレクトリパスを削除すると、プロセスが実行されていますが、getcwd APIが失敗します(NULLを返します)。

例: プロセス名は次のとおりです。a.exeを実行した後/root/appl/a.exea.exe存在、現在の作業ディレクトリが削除された場合getcwd(3) APIが失敗します。

getcwd(3)の代替APIはありますか?ディレクトリパスが削除されても、プロセスの現在の作業ディレクトリを知ることはできますか?

+2

ディレクトリが削除されても何が戻ってくると思いますか?もしあなたがデーモンとして何かを実行しているのであれば、ほとんどすぐに 'chdir("/");するべきです。 –

+0

アプリケーションはtempディレクトリを作成してデプロイされますが、appln startを実行すると一時フォルダが削除されますので、getcwd呼び出しが失敗します。プロセスのローカルディレクトリを知る必要があります。 [Linuxシステム用] – Syedsma

答えて

3

私は、ディレクトリだけであれば、オープン保持されているとして存在し続けるときに現在の作業ディレクトリの結果とを何をするか全くわからない - あなたは新しいファイルを作成することはできません。ディレクトリで、それはそれは削除することができるように空でなければならなかった - しかし、あなた名前を発見する/proc/self/cwdreadlink(2)を使用することができます。

$ mkdir syedsma 
$ cd syedsma/ 
$ /tmp/proccwd 
/proc/self/cwd reports: /tmp/syedsma 
$ /tmp/getcwd 
getcwd: /tmp/syedsma 
$ rmdir ../syedsma/ 
$ /tmp/getcwd 
getcwd failed: No such file or directory 
$ /tmp/proccwd 
/proc/self/cwd reports: /tmp/syedsma (deleted) 
$ 

は、ここに私のgetcwd.cです:

- 私はあなたがそうでなければ、現在のを知るためにあなたのプログラムのための十分な理由があるかもしれないと想像することができます

#include <stdio.h> 
#include <unistd.h> 
#include <limits.h> 

int main(int argc, char* argv[]) { 
    char buf[PATH_MAX]; 

    ssize_t r = readlink("/proc/self/cwd", buf, sizeof(buf)); 

    if (r < 0) { 
     perror("readlink /proc/self/cwd failed"); 
     return 1; 
    } else { 
     buf[PATH_MAX-1] = '\0'; 
     printf("/proc/self/cwd reports: %s\n", buf); 
    } 
    return 0; 
} 

mu is too shortは、それがデーモンである場合chdir("/");に彼の助言で正しいです:

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) { 
    char p[1000]; 
    char *r; 
    r = getcwd(p, sizeof(p)); 
    if (!r) 
     perror("getcwd failed"); 
    else 
     printf("getcwd: %s\n", p); 
    return 0; 
} 

そして、ここでは私のproccwd.cですまだ存在していればどのようなパス名になっていたのかを知ることさえできますが、一般的には気にしないでください。パス名"."は、ユーザのためにpwdシェルを実装する必要があるまで、現在の作業ディレクトリが必要なすべてのケースで機能します。

0

これを試してください。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main() { 
    char path[256]; 
    char buf[BUFSIZ]; 

    mkdir("/tmp/foo", 0755); 
    chdir("/tmp/foo"); 
    rmdir("/tmp/foo"); 

    sprintf(path, "/proc/%d/cwd", getpid()); 
    if (readlink(path, buf, sizeof(buf)) != -1) { 
    char* stop = buf+strlen(buf)-10; 
    if (!strcmp(stop, " (deleted)")) { 
     *stop = 0; 
    } 
    printf("[%s]\n", buf); 
    } 
} 
0

環境変数$ PWDを取得し、アプリケーションにキャッシュします。

関連する問題