0

在我们的应用程序中,我们调用getcwd(3)以获取当前工作目录。

当进程开始运行时,如果有人删除目录路径,则进程正在运行但getcwdAPI 失败(返回NULL)。

示例:进程名称为: 运行后a.exe 出现,如果当前工作目录被删除,则api失败。/root/appl/a.exea.exegetcwd(3)

是否有任何替代 APIgetcwd(3)可以知道进程的当前工作目录,即使目录路径已删除?

4

3 回答 3

4

我不完全确定您将如何处理当前工作目录的结果,只要该目录保持打开状态,该目录将继续存在 - 您无法在目录中创建新文件,它必须为空,以便可以将其删除 - 但您可以使用readlink(2)on/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用户实现内置的 shell。

于 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 回答