하나의 HTTP 요청을 처리하는 여러 스레드를 생성하는 데몬 프로세스가 있습니다. 데몬 프로세스가 상대 경로를 통해 지정된 파일을 찾을 수 없습니다.
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");
코드가 함께 충돌 핸들러는 나는 다음과 같은 코드가
resources/html/index.html
에있는 파일을 반환하기위한 것입니다 해당 파일에 대한 요청이있을 때 "분할 오류"오류가 발생합니다.
fopen에서 깨기 위해 GDB를 사용할 때 NULL이 반환되고 errno
이 2 (파일을 찾을 수 없음)로 설정되어 있음을 확인합니다. 또한
, 나는 파일의 절대 경로를 사용하는 코드를 변경할 때 :
/usr/sbin/app/resources/html/index.html
다음`는 fopen() 인덱스 파일을 찾을 수 있으며, 모든 것이 잘 작동합니다.
또 다른 언급 할 점은 데비안 리눅스에서 실행할 때이 오류가 발생하지만 우분투 12.04에서는 내 질문이 멍청한 것처럼 보일 수 있다는 것입니다.
'resources'폴더가 들어있는 동일한 폴더에서 프로그램을 실행하고 있다는 것을 잊어 버렸습니다.
'read_file_ex() '를 호출 할 때 현재 작업 디렉토리는 무엇입니까? –
왜'fopen'의 직후에 파일을'fclose'할까요? 'fclose' 다음에 파일을 읽을 수 없습니다; 이것이'SegFault'의 원인입니다. – ahmad
'resources' 폴더가 들어있는 동일한 폴더에서 프로그램을 실행합니다. GDB에서 현재 디렉토리가 프로그램을 시작한 디렉토리와 동일하다는 것을 알았습니다. 스레드의 현재 디렉토리가 무엇인지 확인할 수있는 다른 방법이 있는지 확실하지 않습니다. –