gpt4 book ai didi

c - 守护进程无法找到文件(通过相对路径指定)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:47 31 4
gpt4 key购买 nike

我有一个生成多个线程的守护进程,其中一个线程处理 HTTP 请求。该处理程序旨在返回位于

中的文件
resources/html/index.html

我有以下代码:

void * read_file_ex(char *file_name, int32_t *data_len) {
FILE *fp;
fp = fopen(file_name, "r");
... // more code to fetch file contents
fclose(fp);
}

void * read_file(char *file_name){
return read_file_ex(file_name, NULL);
}

在线程中,我调用:

read_file("resources/html/index.html");    

当请求该文件时,代码崩溃并出现“Segmentation Fault”错误。

当我使用 GDB 在 fopen 处中断时,我注意到返回了 NULL 并且 errno 设置为 2(找不到文件)。

此外,当我更改代码以使用文件的绝对路径时:

/usr/sbin/app/resources/html/index.html

然后 `fopen()' 能够找到索引文件并且一切正常。

另一件事是,这个错误发生在 Debian Linux 上而不是 Ubuntu 12.04 上,这让我的问题看起来更愚蠢。

我忘了补充一点,我正在从包含“资源”文件夹的同一文件夹中运行该程序。

最佳答案

如果进程的当前目录不是/usr/sbin/app(当前目录似乎不太可能是/usr/bin/app),那么相对路径名将不起作用。在尝试使用它之前,您应该始终检查fopen() 的返回结果。即使您在正确的目录中,打开操作也会失败的原因有无数种,更不用说您有可能不在正确的目录中了。

请注意,如果您的流程使用类似 daemon() 的函数, 或者通过 daemonize 运行程序,当前目录可以更改为 /,即使您希望它在其他地方也是如此。

如果你需要检查进程的当前目录(一个进程有一个所有线程通用的当前目录),你可以使用getcwd()获取当前工作目录。

如果您需要在守护进程之后(再次)更改目录,您可以使用 chdir()这样做。还有 fchdir()如果您有目录的打开文件描述符,它可用于改回目录。

关于c - 守护进程无法找到文件(通过相对路径指定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842640/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com