C/Linux
[C] chmod a+rX [path] 구현하기
김호록님
2023. 1. 3. 19:36
chmod a+rX [path]의 기능
- 모든 읽기 권한을 활성화 한다.
- 디렉토리에는 모든 실행 권한을 활성화 한다.
- 이미 실행 권한이 있는 파일에 대해 모든 실행 권한을 활성화 한다.
요구사항
- chmod a+rX와 동일하게 동작하는 프로그램을 stat()과 chmod()를 이용하여 구현하라.
- path에는 여러 파일의 이름이 연속으로 입력될 수 있다.
- 처리할 파일의 이름을 커맨드 라인으로부터 입력받을 수 있어야 한다.
- 입력 파일의 이름이 변경되어도 처리할 수 있어야 한다.
실행결과 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char **argv) {
int return_stat;
char *file_name;
struct stat file_info;
for (int i = 0; i < argc; i++) {
//모든 읽기 권한 활성화
mode_t file_mode;
file_name = argv[i];
if ((return_stat = stat(file_name, &file_info)) == -1) {
perror("Error : ");
exit(0);
}
file_mode = file_info.st_mode;
//만약 이미 실행 권한이 있다면, 실행 권한 활성화 + 읽기 권한 활성화
if (file_mode & S_IXUSR || file_mode & S_IXGRP || file_mode & S_IXOTH) {
if(chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH) < 0) {
perror("chmod execute error :");
exit(0);
}
}
//나머지 경우 읽기 권한만 활성화
else if (chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH) < 0) {
perror("chmod read error :");
exit(0);
}
//디렉토리이면 모든 실행 권한 활성화 + 읽기 권한 활성화
if (S_ISDIR(file_mode)) {
if (chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH) < 0) {
perror("chmod dir error :");
exit(0);
}
}
}
}
코드가 깔끔하진 않은 것 같아서 아쉬움이 남는다.. 추후 수정해보록 하겠다.