chdir과 stat간의 미묘한 문제점에 대해서
글쓴이: 익명 사용자 / 작성시간: 토, 2003/07/12 - 5:28오전
예전에 linux.co.kr에 올렸다가 답글이 안올라와서 이곳에
다시 올립니다.
이것이 진짜로 호환의 문제인지 저의 무지에서 오는 잘못된 인식인지 명확하지 않지만 몇자 적어보겠습니다. 간단히 다음과 같은 코드를 작성했습니다.
struct stat s_Stat; chdir("/usr/home/users/guest"); if(stat(".bashrc", &s_Stat) == 0)fprintf(stdout, "OK\n"); else perror("Directory test: ");
근데 다음의 코드는 진짜로 문제가 없어보입니다.
근데 희한하게도 root계정으로 실행을 하였음에도 불구하고
간혹 이것은 Error를 나타냅니다.
즉, chdir은 되었음에도 불구하고
그곳에 있는 .bashrc라는 파일의 상태를 얻는것에 실패를 합니다.
항상 실패하는 것도 아니며 간혹 그런다는것도 희한합니다.
당연히 이 프로그램은 /usr/home/users/guest 에서 실행한것은 아니고 /root 에서 실행한 것입니다.
그래서 저는 다음과 같이 작성해봤습니다.
struct stat s_Stat; char *s_CurrentPath; char s_TempPath[256]; chdir("/usr/home/users/guest"); s_CurruntPath = getcwd(NULL, 0); sprintf(s_TempPath, "%s/%s", s_CurrentPath, ".bashrc"); if(stat(&s_TempPath[0], &s_Stat) == 0)fprintf(stdout, "OK\n"); else perror("Directory test: "); free(s_CurrentPath);
참 희한하죠? 이렇게 하면 100% 됩니다.
저는 이게 Linux syscall의 bug이거나 Cache의 버그라고 생각의 방향을
결정중인데 어떤지 모르겠군요.
어찌되었건 stat 함수에 절대경로를 취하면 잘 되지만 chdir로 디렉토리를 설정하고
하게 되면 stat에는 상대경로가 적용되지 않는다고 봐야 겠지요...
혹시 이 문제의 원인을 아신다면 리플 달아주세요.
참고로 커널은 2.4.18 정식(패치되지 않은) 커널입니다.
Forums:
>간혹 이것은 Error를 나타냅니다. 다음중 어떤 에러가 발생
>간혹 이것은 Error를 나타냅니다.
다음중 어떤 에러가 발생하는지요?
사소한 실수가 아닐까요?
이거는 경로지정없이 .bashrc 파일에 대고 stat()하는거고요.
이것은 상대경로이기 때문에 문제의 소지가 좀 있고요.
(chdir()이 fail한다면.... 다 fail나지요)
이거는 /usr/home/users/guest/.bashrc 파일에다 하고요.(절대경로)
첫번째것이 안된다고 하는걸로 봐서는 상대경로 지정상의 문제일듯
싶네요. 첫번째것의 경우 chdir()이 왜 fail하는지 검사해보시는게 좋을 듯 합니다. 보니까 chdir()검사루틴이 안보이네요.
아니면 커널 버그일 수도 있고요...
Written By the Black Knight of Destruction
errno 를 적어 주세요 쫌.chdir() 실패 하는 이유는 아
errno 를 적어 주세요 쫌.
chdir() 실패 하는 이유는 아마도 퍼미션문제가 아닐런지...
또 stat(".bashrc" ) 말고 stat("./.bashrc") 로도 해보시고...
내 자식들도 나처럼 !!
음... 역시 chdir 쪽에서 에러를 리턴한 경우겠지요?근데 이
음... 역시 chdir 쪽에서 에러를 리턴한 경우겠지요?
근데 이 코드를 호출하는 함수이전에 이미
그 경로가 디렉토리가 있는지 검사했었거든요.
그래서 chdir에 대한 에러검사를 누락시킨건데
거기서 오류가 있나봅니다.
chdir의 man page를 찾아보니 파일시스템에 따라서 다른 에러도 더 있을수
있다고 하는군요.......
답변 감사합니다.
댓글 달기