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

标签 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 来了解进程的当前工作目录,即使目录路径已删除?

最佳答案

我不完全确定您将如何当前工作目录的结果,因为该目录将仅在打开时继续存在-- 你不能在目录中创建新文件,它必须是空的,这样它才能被删除 -- 但你可以/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 short如果它是一个守护进程,他对 chdir("/"); 的建议是正确的——我可以想象你可能有充分的理由让你的程序知道它当前的工作目录,甚至知道路径名如果仍然存在的话可能是什么——但一般来说,您不应该在意。路径名 "." 几乎适用于需要当前工作目录的所有情况,直到您需要为用户。

关于c - getcwd 是否有任何替代 API 来获取进程的工作目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6464073/

相关文章:

c++ - uint8 使用 SIMD Neon 内在函数 float

c - 修改单个结构成员

linux - 接受搜索字符串的脚本,搜索包含该字符串的文件夹并将它们移动到与该字符串同名的文件夹中

php - 使用 curl -F 标志发布嵌套参数

c - Fork and Pipe 问题 - 无限打印

c - 未分配正在释放的指针,中止陷阱 : 6

linux - linux shell如何获取/etc/passwd中用户名的进程信息

linux - 我们可以使用 fgets()、fputs()、feof() 等函数执行操作吗?对于像我们用于普通文件的 fifo 文件?

Android:几个Camera API问题

api - 从 Go 中的接口(interface)访问数据