我有一个守护程序进程,它产生几个线程,其中一个线程处理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'文件夹的同一文件夹运行程序。
答案 0 :(得分:3)
如果进程的当前目录不是/usr/sbin/app
(并且当前目录似乎不太可能/usr/bin/app
),则相对路径名将不起作用。在尝试使用之前,您应始终检查fopen()
的返回结果。即使你在正确的目录中,开放式操作失败也有无穷无尽的原因,更不用说当你有可能失败的时候。
请注意,如果您的流程使用daemon()
等功能,或者通过daemonize
程序运行,那么当前目录可以更改为/
,即使您希望它位于其他地方
如果需要检查进程的当前目录(进程具有所有线程共有的单个当前目录),则可以使用getcwd()
获取当前工作目录。
如果您需要在守护进程后再次更改目录,则可以使用chdir()
来执行此操作。还有fchdir()
,如果你有一个打开目录的文件描述符,它可以用来改回目录。