在我们的应用程序中,我们调用getcwd(3)
以获取当前工作目录。
当进程开始运行时,如果有人删除目录路径,则进程正在运行但getcwd
API 失败(返回NULL
)。
示例:进程名称为:
运行后a.exe
出现,如果当前工作目录被删除,则api失败。/root/appl/a.exe
a.exe
getcwd(3)
是否有任何替代 APIgetcwd(3)
可以知道进程的当前工作目录,即使目录路径已删除?
在我们的应用程序中,我们调用getcwd(3)
以获取当前工作目录。
当进程开始运行时,如果有人删除目录路径,则进程正在运行但getcwd
API 失败(返回NULL
)。
示例:进程名称为:
运行后a.exe
出现,如果当前工作目录被删除,则api失败。/root/appl/a.exe
a.exe
getcwd(3)
是否有任何替代 APIgetcwd(3)
可以知道进程的当前工作目录,即使目录路径已删除?
我不完全确定您将如何处理当前工作目录的结果,只要该目录保持打开状态,该目录将继续存在 - 您无法在目录中创建新文件,它必须为空,以便可以将其删除 - 但您可以使用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。
尝试这个。
#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);
}
}
获取 $PWD 环境变量并将其缓存在您的应用程序中。