경로 이름 인수가 디렉토리인지, 실행 권한이 있는 일반 파일인지, 일반 파일인지, 심볼릭 링크인지를 인쇄하는 간단한 프로그램이 있습니다.
이를 결정하기 위해 다음 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_IFDIR
S
F
이것은 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입니다.