파일 통계 프로그램 [닫기]

파일 통계 프로그램 [닫기]

경로 이름 인수가 디렉토리인지, 실행 권한이 있는 일반 파일인지, 일반 파일인지, 심볼릭 링크인지를 인쇄하는 간단한 프로그램이 있습니다.

이를 결정하기 위해 다음 if 문이 있습니다(mode_t 모드는 struct stat에서 파생됨).

if (mode & S_IFDIR){
    mode_s[n] = 'd';
} else if (is_user_exec(mode, ouid, ogid) && (mode & S_IFREG)){
    mode_s[n] = 'e';
}else if (mode & S_IFREG){
    mode_s[n] = 'f';
} else if (mode & S_IFLNK){
    mode_s[n] = 'l';
} else {
    mode_s[n] = 'o';
}

처음 세 개는 모두 잘 작동하지만 "o"로 분류되어야 하는 항목을 전달하면 "l"로 나열됩니다.

내 코드가 왜 이 문제를 일으키는지 알아낼 수 있는 사람이 있나요?

참고로 저는 이 프로그램을 MINIX 3.2.1에서 컴파일하고 실행하고 있는데 문제의 문제 있는 경로 이름은 /dev/ptyp8입니다.

답변1

사용 가능한 MINIX 시스템은 없지만 "모드"가 다양한 파일 형식에 대해 서로 다른 비트를 갖지 않는다는 것이 문제라고 확신합니다. 비교 ( 대신 ) S_ISDIR대신 유사한 매크로를 사용해야 합니다 .S_IFDIRSF이것은 GNU C 라이브러리입니다.

다음은 Linux 시스템의 이전 버전입니다. 선행은 0값이 8진수임을 의미합니다.

  #define S_ISDIR(m)    (((m) & S_IFMT) == S_IFDIR)

  #define S_IFMT  00170000
  #define S_IFSOCK 0140000
  #define S_IFLNK  0120000
  #define S_IFREG  0100000
  #define S_IFBLK  0060000
  #define S_IFDIR  0040000
  #define S_IFCHR  0020000

따라서 코드는 (모드 & 0120000)이 0이 아닌지 테스트하고 있으며 비트 0100000 또는 020000이 설정된 경우 해당 비트는 S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK 및 S_IFCHR에 사용됩니다. 귀하의 pt 유형은 S_IFCHR입니다.

관련 정보