- 전체
- C/C++ 일반
- C/C++ 수학
- C/C++ 그래픽
- C/C++ 자료구조
- C/C++ 인공지능
- C/C++ 인터넷
- wxWidget
- GTK+
- UNIX or LINUX programming
- 리눅스 마스터 - 국가공인자격
- VC++/ MFC
- C#/CLI/.NET
- QT/기타UI
- Boost lib
- 오픈소스 C 분석자료
- MSA (마이크로서비스), Docker, kubernetes
- WSL(windows subsystem linux)
UNIX or LINUX programming linux c 파일 접근권한 정보 가져오기
2014.02.28 15:26
linux c 파일 접근권한 정보 가져오기
[출처] http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/FileInfo
파일의 종류
Unix 에서는 디렉토리, 장치, 소켓, FIFO 등 모든것이 파일로 존재한다. 그러므로 우선 우리는 작업을 하고자 하는 파일이 어던 종류의 파일인지를 먼저 판단할수 있어야 한다. Unix 상에서 "ls -al" 을 이용하면 아래와 같은 결과물을 볼수 있을것이다.
[yundream@localhost test]# ls -al ... -rw-r--r-- 1 root root 249 9월 10 11:25 wc.1 drwxr-xr-x 2 root root 4096 12월 5 18:01 web_install srwxr-xr-x 1 root root 0 1월 14 18:05 loging_socket ...
위의 결과에서 가장 앞부분 10자리가 그 파일의 특성과 권한을 나타내는데, 그중 제일 앞부분이 파일의 종류를 나타내고, 우리는 가장 앞부분의 한바이트의 문자를 이용해서 어떤 종류의 파일인지를 알아낼수 있다.<br> Unix 에서 자주 사용하는 파일의 종류를 아래 테이블에 정리해 두었으니 참고 바란다.
| - | 일반 파일 |
| s | 소켓파일 |
| d | 디렉토리 |
| p | FIFO |
| l | 심볼링 링크된 파일 |
| b | 블럭 디바이스 |
| c | 캐릭터 디바이스 |
파일 정보 가져오기
파일의 정보는 stat(2)를 통해서 가지고 오며, 가지고온 정보는 struct stat 구조체에 저장된다. stat 구조체는 다음과 같은 내용을 가지고 있다.
struct stat
{
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
unsigned long st_blksize; /* blocksize for filesystem I/O */
unsigned long st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
위의 구조체의 정보는 inode 테이블을 참조해서 가지고오며, 우리가 필요로 하는(그 이상의) 상세한 정보를 가져온다는 것을 알수 있을것이다. inode 테이블에 대한 내용을 원한다면 /usr/src/linux/include/fs.h 의 sturct inode 를 참조하면 된다.
그럼 간단한 예제 프로그램을 만들어 보겠다. 이 프로그램은 아규먼트로 파일이름을 받아서 그 파일의 정보를 되돌려주는 프로그램으로, 파일의 권한, 퍼미션, 파일의 크기, 마지막에 수정된 날짜, 파일의 종류 등을 되돌려줄것이며, 존재하지 않는 파일의 경우 적절한 에러메시지를 출력하고 종료하게 될것이다. <br> 이 예제의 이름은 file_info 로 하겠다. <br><br>
완벽하진 않지만 그럭저럭 작동하는 프로그램이다.
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
int main(int argc, char **argv)
{
int return_stat;
char *file_name;
struct stat file_info;
struct passwd *my_passwd;
struct group *my_group;
mode_t file_mode;
if (argc != 2 )
{
printf("Usage : ./file_info [file name]\n");
exit(0);
}
file_name = argv[1];
if ((return_stat = stat(file_name, &file_info)) == -1)
{
perror("Error : ");
exit(0);
}
file_mode = file_info.st_mode;
printf("파일이름 : %s\n", file_name);
printf("=======================================\n");
printf("파일 타입 : \n");
if (S_ISREG(file_mode))
{
printf("정규파일\n");
}
else if (S_ISLNK(file_mode))
{
printf("심볼릭 링크\n");
}
else if (S_ISDIR(file_mode))
{
printf("디렉토리\n");
}
else if (S_ISCHR(file_mode))
{
printf("문자 디바이스\n");
}
else if (S_ISBLK(file_mode))
{
printf("블럭 디바이스\n");
}
else if (S_ISFIFO(file_mode))
{
printf("FIFO\n");
}
else if (S_ISSOCK(file_mode))
{
printf("소켓\n");
}
my_passwd = getpwuid(file_info.st_uid);
my_group = getgrgid(file_info.st_gid);
printf("OWNER : %s\n", my_passwd->pw_name);
printf("GROUP : %s\n", my_group->gr_name);
printf("FILE SIZE IS : %d\n", file_info.st_size);
printf("마지막 읽은 시간 : %d\n", file_info.st_atime);
printf("마지막 수정 시간 : %d\n", file_info.st_mtime);
printf("하드링크된 파일수 : %d\n", file_info.st_nlink);
}
|
프로그램은 아마 설명이 필요 없을 정도로 간단할것이다. 단지 마지막의 file_info.st_nlink (하드링크) 부분이 약간 헷갈릴 것이다. 하드링크란 보통 C 의 link(2) 함수와 쉘 코멘드인 link 에 -d 옵션을 줌으로서 만들어 진다. cp 를 이용한 복사와 하드링크를 혼동하지 말라, cp 를 이용한 복사는 자신만의 inode 를 가지는 전혀 새로운 파일을 만들지만, 하드링크의 경우 동일한 inode 를 가지고 파일이름을 만든다. 하드링크는 inode 를 가지고 파일이름을 만들므로 서로 다른 파일시스템 사이로 연결할수는 없다.<br> 그 이유는 inode 가 해당 파일시스템에서만 유일하기 때문으로 여러개의 파일시스템을 사용할경우 다른 쪽 파일시스템에서 그 inode 가 유일함을 보장할수 없기 때문이다.
stat 는 너무 복잡합니다. 더 간단한 함수는 없을까요?
우리가 어떤 프로그램을 만들때, 우리는 종종 그 프로그램이 사용하는 파일(설정파일, 데이타 파일)들이 존재하는지 등을 검사할 필요가 있다. 이때에도 위의 stat 를 이용해서 해결 할수 있지만, 왠지 복잡하다는 생각이든다. <br> 이때는 access(2) 를 사용하면된다.
access 는 검사할 파일에 대하여 4가지 항목, 읽을수 있는지(R_OK), 쓸수 있는지 (W_OK), 실행가능 한지 (X_OK), 존재하는 파일인지(F_OK) 등에 대한 정보를 돌려준다.
#include |
[yundream@localhost test]# gcc -o access access. 파일이 존재하지 않음 : : No such file or directory
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 8 | systemcall을 hooking 해 볼까요? | 졸리운_곰 | 2015.06.16 | 600 |
| 7 |
리눅스 화면 녹화 : Linux Screen Recoding to make Movie
| 졸리운_곰 | 2015.05.09 | 564 |
| 6 |
도커(docker) 리눅스 경량(가벼운)가상화 프로그램 기본 및 설치 사용
| 졸리운_곰 | 2015.01.28 | 967 |
| 5 | system 다른 프로그램 실행 및 대기 | 졸리운_곰 | 2014.10.27 | 756 |
| 4 |
Ubuntu Qt install (우분투 Qt 설치하기)
| 졸리운_곰 | 2014.10.09 | 590 |
| 3 | Linux Qt Creator Installation | 졸리운_곰 | 2014.09.17 | 508 |
| 2 | 파일의 존재여부 검사 [access()함수] access() 파일 존재나 접근 권한을 확인합니다. | 졸리운_곰 | 2014.03.03 | 1290 |
| » | linux c 파일 접근권한 정보 가져오기 | 졸리운_곰 | 2014.02.28 | 1163 |

