access (2)
1) Manual 정리
#include <unistd.h>
int access(const char *pathname, int mode);
C
복사
•
pathname에 해당하는 파일에 접근 가능한지 확인한다. (심볼릭 링크일 경우 역참조됨)
•
mode는 확인할 권한: OR 연산으로 여러 플래그 사용 가능
◦
F_OK: 파일 존재 여부
◦
R_OK: 읽기 권한
◦
W_OK: 쓰기 권한
◦
X_OK: 실행 권한
•
Return value: 성공시 0, 실패 혹은 에러시 -1을 반환. 상황에 따라 errno를 설정.
2) 예시코드
//main.c
#include <unistd.h>
#include <stdio.h>
int main(void)
{
if (access("test.txt", F_OK | R_OK) < 0)
{
perror(NULL); //perror는 현재 errno에 해당하는 시스템 에러 메세지를 stderr로 출력
return (1);
}
else
{
printf("can read file\n");
return (0);
}
}
C
복사
실행 결과
처음 파일을 만들고 실행하면 읽을 수 있지만, 권한을 없애거나 파일이 없을 경우(즉 mode 중 하나라도 실패할 경우) 해당하는 에러 메세지가 출력된다.
추가로 알아볼 것
•
access는 해당 프로세스의 real UID, GID를 이용해 확인한다. (effective ID를 이용하지 않음) → 둘 차이가 뭔지 공부 필요...
•
주의사항: 매뉴얼에 따르면 파일을 open 하기 전에 권한을 확인하는 등의 용도로 사용할 경우, access와 open 사이 시간 간격이 파일 조작 등에 이용될 수 있어 보안상 위험하다고 한다. → 사용하지 않는 것을 권고 / 혹은 open 전에 프로세스의 effective ID를 real ID로 바꾸는 것이 보다 안전하다고 한다.
Q. access 를 꼭 써야할까..?
•
매뉴얼에서 사용하지 않는 것을 권하고 있음
•
access함수를 이용해 확인할 수 있는 에러 상황들을 확인해 본 결과, 바로 open, execve등을 적용하고 errno를 확인해도 충분하다는 결론을 얻음. → 굳이 사용할 필요 없다고 판단함.