read에서 EFAULT(14)(bad address) 에러...
글쓴이: partout / 작성시간: 월, 2006/01/16 - 5:15오후
#include <sys/types.h> #include <sys/fcntl.h> #include <stdio.h> #include <stdlib.h> int main(void) { int fd, n; char s[128]; if ((fd = open("./test", O_RDONLY)) < 0) { fprintf(stderr, "open failed\n"); exit(1); } n = read(fd, s, 1024); s[n] = '\0'; close(fd); fprintf(stdout, "n = %d\n", n); fprintf(stdout, "s = %s\n", s); return 0; }
문자배열 s의 크기(128)가 read 함수에 인자로 넘겨진 1024보다 작기 때문에 분명 문제가 있는 코드이기는 한데,...
만약 ./test 파일의 크기가 작다면 문제가 될까요?
./test 파일에 8 바이트 정도의 내용을 채우고서 테스트해 봤는데,
일반적으로는 문제가 없었는데, 유독 Debian 3.1에서만 문제가 있네요.
그것도 일반 유저나 - 옵션 없이 su를 사용해 루트로 로그인한 뒤
실행한 경우에는 문제가 없었는데, su - 를 사용해서 루트로 로그인 한 뒤 위 코드를 실행하면 Bad Address가 나더군요.
그냥 코드를 고치면 되기는 한데, 원래 이렇게 Bad Address가 발생하는 것인지 궁금하더군요.
아래는 Debian 3.1에서 테스트한 결과입니다.
$ ./t n = 8 s = ifkdjfk $ su Password: # ./t n = 8 s = ifkdjfk $ su - Password: # ./t n = -1 s =
답변 부탁 드립니다.
Forums:
su - 로 로그인 하면current directory 가 ~root
su - 로 로그인 하면
current directory 가 ~root 로 바뀔텐데
그래서 ./test 를 못찾는게 아닐까요?
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
그건 아닙니다..위에 캡쳐해 놓은 결과에서 보듯이, 해당 디렉토리
그건 아닙니다..
위에 캡쳐해 놓은 결과에서 보듯이, 해당 디렉토리로 이동한 뒤에 실행한 겁니다.
test 파일을 찾을 수 없어서 그런 거라면, read에서 EFAULT가 나는 대신에 아마 open에서 에러가 나지 않았을까요? ^^
어찌나 졸린지..~~
댓글 달기