2011-09-02 2 views
1

제가 해결 방법이 있다고 생각되는 이상한 문제가 있습니다. 근본 원인 분석을하려고합니다.offstream vs ofstream

저는 Ubuntu 10.04 LTS의 임베디드 버전에서 실행되는 응용 프로그램을 개발해 왔습니다. 응용 프로그램이 시작되면 SD 카드에서 구성 파일을 읽어 들여 몇 개의 클래스를 초기화하고 SD 카드에 기록하는 로거를 시작한 다음 작업을 진행합니다. 개발 중에는 SSH 터미널을 통해 수동으로 시작할 때 제대로 실행됩니다.

최근 OS를 시작할 때 응용 프로그램이 자동으로 시작되도록 실험하고 있습니다. 나는 init.d에있는 스크립트를 가지고있다. 그러나 지금은 로그 파일이 생성되지 않는 것으로 나타났습니다. 구성 파일이 시작시 제대로 읽히기 때문에 SD 카드를 사용할 수 없다는 것이 문제가 아니라는 것을 알았지 만 fopen을 사용하여 쓰기 위해 로그 파일을 열려고하면 오류가 발생합니다.

// Open the file 
mLogFile = fopen(filename, "wb"); 
if(mLogFile == NULL) 
{ 
    printf("Error opening Log File [%d].\n", lnRetval); 
    return -1; //File couldn't be opened 
} 

나는 그냥 권한 문제였다 가정,하지만 난 자동으로 터미널에서 수동으로 실행 대 소프트웨어를 시작할 때 작동하지 않는 이유를 저는 이해할 수 없습니다. 또한, 나는 왜 config 파일이 제대로 읽히지 만이 파일을 열 수 있는지 이해할 수 없다.

내가 볼 수있는 유일한 차이점은 로거가 C 파일 I/O를 사용하는 동안 config 파일 읽기가 fstream을 사용하여 수행된다는 것입니다. 그래서 위의 fopen 호출 바로 앞에 다음 코드를 삽입하여 실험했습니다 (/ home/root/etc는 SD 카드가 마운트 된 곳입니다).

std::ofstream out("/home/root/etc/log/testlog.log"); 
out << "I can write using fstreams.\n"; 
out.close(); 

이는 init.d를 통해 시작될 때 파일을 생성하고 생성했습니다. 이제 나는 완전히 난감 해. 왜 스트림이 작동하고 fopen하지 않습니까? 근본적으로 내가 빠진 것이 있습니까?

미리 감사드립니다.

+1

당신은 로그 파일이 생성되지 않았다고 말했고 fopen으로 로그 파일을 열려고하면 오류가 발생했습니다. fopen으로 유효한 로그 파일을여시겠습니까? .. 내가 놓친다면 미안해. – Wasi

+0

스트림 테스트에서 테스트 로그에 하드 코딩 된 경로를 지정했습니다. fopen() 호출에 사용 된'filename'도 전체 경로를 지정 했습니까? 수동 시작과 init.d 시작 사이에 다른 상대 경로가 아닌지 확인하십시오. –

+0

질문은'** std :: ofstream'을 통해 사용될 때'fopen'이 작동하는 이유는 무엇입니까? ** 직접 사용하면 ** 않습니다. 왜냐하면'std :: ofstream'은 내부에서'fopen'을 사용하기 때문입니다. –

답변

2

질문에 대한 답변이 충분하지 않지만이 문제에 대한 일반적인 접근 방법은 두 양식 모두에서 strace 아래의 프로그램을 실행하고 만든 syscalls의 순서를 비교하는 것입니다. 그러면 다른 일이 벌어지고있는 것을 빨리 알 수 있습니다. 나는 당신이 단지 filename의 내용이 유효하지 않다는 것을 의심합니다 ...