0

getcwd(3)このアプリケーションでは、現在の作業ディレクトリを取得するために呼び出します。

プロセスの実行が開始されたときに、だれかがディレクトリ パスを削除すると、プロセスは実行されますが、getcwdAPI は失敗します ( が返されますNULL)。

例: Process name is: a.exe present in /root/appl/a.exe after running a.exe、現在の作業ディレクトリが削除された場合、getcwd(3)API は失敗します。

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

4

3 に答える 3

4

ディレクトリが開いたままになっている間だけディレクトリが存在し続ける場合、現在の作業ディレクトリの結果をどうするかは完全にはわかりません。ディレクトリに新しいファイルを作成することはできません。削除できるように空にします。ただし、を使用して名前を見つけることができます。readlink(2)/proc/self/cwd

$ 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>

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

#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が短すぎるというのは、デーモンであるかどうかについての彼のアドバイスで正しいですchdir("/");-プログラムが現在の作業ディレクトリを知っているのには十分な理由があるかもしれませんし、パス名が何であったかさえ知っているかもしれませんそれがまだ存在していた場合-しかし、一般的には、気にする必要はありません。パス名は、ユーザーに組み込みのシェル"."を実装する必要があるまで、現在の作業ディレクトリが必要であることが理にかなっているほぼすべての場合に機能します。pwd

于 2011-06-24T06:34:57.330 に答える
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);
  }
}
于 2011-06-24T06:42:39.117 に答える
0

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

于 2011-06-24T07:27:34.470 に答える