2011-11-11 5 views
1

는 다음 코드와 nftw를 사용하여 디렉토리 트리에있는 모든 .c 인 파일을 얻으려고 : 그것은 리눅스와 솔라리스에서 작동BSD에서 nftw가 다릅니 까?

static int gf(const char *path, const struct stat *st, int t, struct FTW *ftw) { 
    if (t != FTW_F) 
     return 0; 
    if (strcmp(ext(path), ".c") == 0) 
     addl(&files, dup(abspath(path))); 
    return 0; 
} 

void getfiles(char *path) { 
    nftw(path, gf, 255, FTW_PHYS); 
} 

하지만, PC-BSD에 그것은 단순히 어떤 따기하지 않음으로써 실패 파일. 내가 뭘 놓치고 있니?

+0

strdup에 실제로 "dup"이름을 사용 했습니까? 그것은 일어날 재앙처럼 보인다! dup2가 두 개의 문자열을 복사합니까? –

+0

문자열에 대한 자체 메모리 관리를하고 있습니다. dup은 일반적인 메모리 관리자의 오버 헤드없이 strdup과 기본적으로 동일한 작업을 수행하는 함수입니다. 하지만 그 함수에 버그가 있더라도, 관찰 된 행동을 설명하지는 않습니다. 왜냐하면 내가 실행중인 테스트는 기본적으로 addl이 호출되었는지 여부 만 검사하기 때문입니다. – rwallace

+3

그러나 dup은 파일 디스크립터를 복제하는 표준 라이브러리 함수이므로 끔찍한 이름입니다. –

답변

1

nftw의 반환 값은 무엇입니까? -1이고 errno isEINVAL으로 설정하면 OPEN_MAX 값을 초과 할 가능성이 매우 높습니다. 더 작은 값을 세 번째 매개 변수로 nftw에 전달하고 OPEN_MAX보다 작은 지 확인하십시오.

관련 문제