【问题标题】:Is there any alternative API for getcwd to get the working direcory of process [closed]getcwd 是否有任何替代 API 来获取进程的工作目录[关闭]
【发布时间】:2011-06-24 06:07:48
【问题描述】:

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

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

示例: 进程名称是:a.exe 存在于/root/appl/a.exe 运行a.exe后,如果当前工作目录被删除,getcwd(3) api会失败。

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

【问题讨论】:

  • 如果目录已被删除,会返回什么?如果您将某些东西作为守护进程运行,那么您可能应该立即chdir("/");
  • 应用程序是通过创建一个临时目录来部署的,在 appln 开始运行后临时文件夹将被删除......因此 getcwd 调用失败......我需要知道是否有任何其他方式来了解进程的本地目录...[适用于linux系统]
  • 当您处于未链接目录中时,您希望/期望得到什么?它没有路径名!

标签: c linux api system-calls getcwd


【解决方案1】:

我不完全确定您将当前工作目录的结果做什么,如果该目录将继续存在,只要它保持打开状态-- 你不能在目录中创建新文件,它必须是空的才能被删除 -- 但你可以/proc/self/cwd 上使用readlink(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>

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。

【讨论】:

    【解决方案2】:

    试试这个。

    #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);
      }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 2010-09-15
        • 2010-10-03
        • 1970-01-01
        相关资源
        最近更新 更多