getcwd是否有任何替代API来获取进程的工作目录

时间:2011-06-24 06:07:48

标签: c linux api system-calls getcwd

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

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

实施例: 流程名称为:a.exe /root/appl/a.exe 运行a.exe后,如果删除当前工作目录,getcwd(3) api将失败。

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

3 个答案:

答案 0 :(得分:3)

我不完全确定当前工作目录的结果将当目录只有在保持打开状态时才会继续存在 - 您无法在目录中创建新文件,并且必须为空,因此可以将其删除 - 但您可以使用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 is too shortchdir("/");的建议是正确的,如果它是一个守护进程 - 我可以想象你可能有充分的理由让你的程序知道它当前的工作目录,甚至有如果路径名确实存在的话,可以知道路径名是什么 - 但总的来说,你不应该在意。路径名"."几乎适用于需要当前工作目录的每种情况,直到您需要为用户实现内置的pwd shell。

答案 1 :(得分: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);
  }
}

答案 2 :(得分:0)

获取$ PWD环境变量并将其缓存在您的应用程序中。