2011-08-03 3 views
0
에 존재하지 않는 파일 찾기

lpend와 비슷한 프로그램을 재현하기 위해 opendir/readdir/closedir를 사용하고 있는데, "ls" 그것은 "/ dev/fd /"재귀 옵션을 함께, 그것은 실제로 존재하는 것보다 더 많은 파일을 찾을 수 있습니다, 그 숨겨진 된 파일이 아닙니다 (나는 '.'시작 파일을 의미). 사실은 내가 줄 : "/ dev/fd/:" "0 1 2 3" 내 너무. 하지만, gdb에서는 4,5, 6 파일이 3 개 더 있습니다. gdb가 자신의 환경을 생성하므로이 사실을 잊어 버리라고 들었습니다. 내가 LS 시도 "는/dev/FD /"내 프로그램을 제공하는 동안 진정한 LS 즉시 목록을 중지 -R :readdir (3) 이상한 행동 :/dev/

"는/dev/FD/3 :"

"는/dev/FD/3/3/"

"/dev/fd/3/3/......../10 "

STAT 복귀 -1 40 개 적어도 파일하지만 실행이 계속 후 : 세그먼트 오류.

내 컴퓨터에서 "S_ISDIR"매크로는 기존 파일에서 "/ dev/fd/3 /"과 같이 존재하지 않는 파일에서 나를 0으로 반환합니다./"1을 반환합니다 ...

나는 왜 내 프로그램이 잘못 되었는가를 알고 싶었습니다. 실제로는 ls가 내 컴퓨터에서 stat64를 사용하지만, 그래도 나는 여전히 잘못되었습니다. fstat64, futex 및 기타 내가 사용하는 syscall을 사용하십시오.

나는 내 코드에 대한 약간의 샘플을 보여 드릴 수 있습니다. 조금 더 자세히 설명해 주셔서 대단히 죄송합니다.

감사합니다.

PS :

+2

'/ dev'에있는 파일이 실제로 가상 파일이라는 것을 이해하고 있습니까? 특히,'/ dev/fd' 아래의 파일들은 현재 열려있는 파일 기술자들과 일치하므로, (opendir (2)를 통해) 디렉토리를 읽는 파일 디스크립터를 여는 것은 디렉토리 내용을 변경합니다. –

+1

@Adam : 답변이어야합니다! – duskwuff

+0

고맙습니다. 파일 시스템에 대한 더 많은 정보를 얻고 이러한 파일을 읽지 않아도되는 문제를 해결해야합니다. – r3dalice

답변

1

PS "가 readdir에 의해 반환 된 데이터가 동일한 디렉토리 스트림의 readdir 이후의 호출에 의해 덮어 쓸 수 있습니다": 내가 안 나는 위해서는 readdir 맨에서 그 진술을하지 않습니다 위해서는 readdir 맨에서 그 진술을 얻을 :

그들이 기본적으로 말을하는 것은 함수가되지 않도록 다시 참가자는 "readdir을 반환하는 데이터 는 같은 디렉토리 스트림에 대한 을의 readdir 이후의 호출에 의해 덮어 쓸 수 있습니다" 포인터가에 의해 반환 된은 다음 번에 readdir 함수를 호출 할 때 가리키는 기본 데이터가 변경되기 때문에 단순히 고유 한 값으로 캐시되지 않아야합니다. 기본적으로 구현에 의해 함수에 의해 재사용 될 수있는 정적으로 할당 된 데이터 나 OS에 의해 관리되는 동적 메모리를 정의 할 수 있으므로 readdir의 호출자는 반환 값으로 가리켜지는 메모리를 관리하는 것에 대해 걱정할 필요가 없습니다. readdir. 예를 들어, 예제 함수 같은 경우 :

int* int_ptr_1 = my_sample_increment(); 
int* int_ptr_2 = my_sample_increment(); 
다음

모두 int_ptr_1int_ptr_2 같은 동일한 값을 가리 킵니다해야 할 일,하고 있다면

int* my_sample_increment() 
{ 
    static int val = 0; 
    val++; 

    return &val; 
} 

것은이 경우가있을 것입니다 값은 1입니다. 각 포인터는 고유 정수 값을 가리 키지 않습니다.

따라서 readdir에서도 마찬가지입니다.readdir을 호출하고 반환되는 포인터를 저장할 수는 없으며 나중에 포인터를 저장 한 시간과 사용 시간 사이의 readdir에 대한 이후 호출에 의해 수정되는 데이터가 수정되지 않고 사용할 수 있습니다. . 이러한 기능이 필요한 경우 재 입력 버전 readdir_r이 해당됩니다.

+0

고마워, 지금 당장있어. – r3dalice