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

时间:2014-02-18 01:26:32

标签: c linux multithreading fopen

我有一个守护程序进程,它产生几个线程,其中一个线程处理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上运行则不会发生这种错误,这使得我的问题看起来更加笨拙。

我忘了添加我从包含`resources'文件夹的同一文件夹运行程序。

1 个答案:

答案 0 :(得分:3)

如果进程的当前目录不是/usr/sbin/app(并且当前目录似乎不太可能/usr/bin/app),则相对路径名将不起作用。在尝试使用之前,您应始终检查fopen()的返回结果。即使你在正确的目录中,开放式操作失败也有无穷无尽的原因,更不用说当你有可能失败的时候。

请注意,如果您的流程使用daemon()等功能,或者通过daemonize程序运行,那么当前目录可以更改为/,即使您希望它位于其他地方

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

如果您需要在守护进程后再次更改目录,则可以使用chdir()来执行此操作。还有fchdir(),如果你有一个打开目录的文件描述符,它可以用来改回目录。