2010-04-14 5 views
13

기본적으로 클래스에 대한 UNIX ls 명령의 복제본을 작성해야하며 거의 모든 것이 작동합니다. 한 가지 방법은 파일이 심볼릭 링크인지 아닌지 확인하는 것입니다. stat()에 대한 man 페이지에서 S_IFLNK으로 정의 된 값이 있음을 알았습니다.파일이 기호 링크인지 여부를 stat()를 사용하여 어떻게 결정합니까?

switch(stbuf.st_mode & S_IFMT){ 
    case S_IFLNK: 
     printf("this is a link\n"); 
     break; 
    case S_IFREG: 
     printf("this is not a link\n"); 
     break; 
} 

내 코드 :

이 나는 ​​파일이 심볼릭 링크가 행운과 함께 여부를 확인하기 위해 노력하고있어 방법이다 (참고, stbuf는 stat()가에 아이 노드 데이터를 반환하는 버퍼이다) 그게 사실이라해도 항상 this is not a link을 인쇄하고 실제 ls 명령이 그렇게 말했기 때문에 그 파일이 심볼릭 링크라는 것을 알고 있습니다. 게다가 sym-link를 만들었습니다 ...

누구든지 내가 무엇을 발견 할 수 있습니까? 잘못하고있는거야? 도와 주셔서 감사합니다!

+2

내 stat (2) 맨 페이지에서 인용 : lstat()는 stat()와 동일하지만 경로가 심볼 링크 인 경우 링크 자체는 stat 파일이며 stat 파일은 참조되지 않습니다. – Philip

답변

21

수 없습니다.

stat()은 링크 자체를 통계하기 위해 lstat()을 사용해야하며 링크 자체를 절대 보지 않습니다.

+0

그렇다면 왜 stat() 명령을 사용 하시겠습니까? 난 그냥 lstat()를 사용하여 시도하고 그것이 링크를 처리 제외하고 같은 정보를 제공하는 것 같습니다. sym-link를 다루지 않는다는 것을 알고있을 때에 만 stat()를 사용하겠습니까? – hora

+3

또한 심볼릭 링크를 처리 할 때 사용합니다. 보통 경로가 일반 파일인지 링크인지 여부에 상관없이 사용되는 파일에 신경을 씁니다. 예를 들어 링크에 대한 mtime은 완전히 흥미롭지 않습니다. mtime은 링크가 가리키는 파일입니다. – wich

+2

'stat()'*는 링크를 처리하지만, 다르게 처리합니다. 링크를 따라 가며 가리키는 파일에 대해 알려줍니다 (원하는 경우 가끔 있음). – caf