목차
1. 문제정의
2. 문제분석
3. Design
4. 결과화면
5. 결론 및 소감
6. Source
7. 예제 5.1 & 5.2
2. 문제분석
3. Design
4. 결과화면
5. 결론 및 소감
6. Source
7. 예제 5.1 & 5.2
본문내용
옵션이 n 과 l 이 아닌 경우 즉 p이거나 l 과 p 가 동시에 나올 경우
// 입력받은 인자값 디렉토리 경로를 dirname에 저장
dirname = argv[i];
}
// dirname이 가리키는 디렉토리를 읽기 전용으로 연다
if((dp=opendir(dirname)) == NULL){ // 만약 열수 없다면 에러출력
perror(dirname);
exit(1);
}
printf("%s:\n", dirname); // dirname 를 출력
// dp에서 다음 디렉토리 엔트리를 dirent 구조체를 가리키는 d에 저장한다
while((d=readdir(dp))!= NULL){ // 디렉토리 파일의 끝을 만날 때 까지 실행
switch(option){ // 옵션에 내용에 따라 출력형태를 달리한다.
case 'l': // l 일 경우 디렉토리에 있는 파일명을 리스트화하여 출력
// filename에 파일의 절대경로/파일이름을 저장한다
sprintf(filename, "%s/%s", dirname, d->d_name);
if(lstat(filename, &st)<0){
// filename이 가리키는 파일정보를 stat구조체 st에 저장
perror(filename);
putchar('\n');
continue;
}
outputStatInfo(filename, d->d_name, &st);
putchar('\n');
break;
case 'p': // 옵션이 p인 경우 파일명 출력
printf("%s ", d->d_name);
break;
case 'z':
// 옵션이 z이면(-l, -p) 입력받은 디렉토리에 있는 파일명을 리스트화 하여 출력
sprintf(filename, "%s/%s", dirname, d->d_name);
if(lstat(filename, &st)<0){
perror(filename);
putchar('\n');
continue;
}
// 파일정보를 출력해주는 함수 호출
outputStatInfo(filename, d->d_name, &st);
putchar('\n');
break;
case 'n': // 옵션이 없는 경우 현재 파일명만 출력
printf("%s ", d->d_name);
break;
}
}
putchar('\n');
closedir(dp);
exit(0);
}
}while(argc--);
}
□ outputStatInfo.c
void outputStatInfo(char *pathname, char *filename, struct stat *st){
int n;
char slink[BUFSIZ+1];
printf("%5d ", st->st_blocks); // 파일시스템 블록 수 출력
printf("%c%s ", typeOfFile(st->st_mode), permOfFile(st->st_mode)); // 파일의 타입과 권한비트 출력
printf("%3d ", st->st_nlink); // 파일의 링크 수 출력
printf("%5d/%-5d ", st->st_uid, st->st_gid); // 파일의 사용자 아이디와 그룹 아이디 출력
// 장치파일일 경우 주/부 장치 번호를 출력하고 그렇지 않은 경우 파일 크기를 출력한다
if(((st->st_mode & S_IFMT) != S_IFCHR) && ((st->st_mode & S_IFMT) != S_IFBLK))
printf("%9d ", st->st_size)
else
printf("%4d,%4d ", major(st->st_rdev), minor(st->st_rdev));
// 접근 시간을 출력한다
printf("%.12s ", ctime(&st->st_mtime)+4);
printf("%s", filename); // 파일 이름 출력
// 만약 심볼릭 링크라면 무엇을 가리키고 있는지 출력 한다
if((st->st_mode & S_IFMT)==S_IFLNK){
if((n=readlink(pathname, slink, sizeof(slink)))<0)
printf(" -> ???");
else
printf(" -> %.*s", n, slink);
}
}
□ typeOfFile.c
char typeOfFile(mode_t mode){
switch(mode & S_IFMT){ // 파일의 형식을 알아낸다
case S_IFREG: // 일반파일
return('-');
case S_IFDIR: // 디렉토리
return('d');
case S_IFCHR: // 문자 특수 장치 파일
return('c');
case S_IFBLK: // 블록 특수 장치 파일
return('b');
case S_IFLNK: // 심볼릭 링크 파일
return('l');
case S_IFIFO: // FIFO 파일
return('p');
case S_IFSOCK: // 유닉스 도메인 소켓
return('s');
}
}
□ permOfFile.c
char * permOfFile(mode_t mode){
int i;
char *p;
static char perms[10];
p=perms;
strcpy(perms, "---------");
for(i=0;i<3;i++){
if(mode&(S_IREAD >> i*3)) // 3비트씩 오른쪽으로 이동하며 읽기권한을 갖는지 확인
*p='r';
p++;
if(mode & (S_IWRITE>>i*3)) // 3비트씩 오른쪽으로 이동하며 Tm기 권한을 갖는지 확인
*p='w';
p++;
if(mode & (S_IEXEC >> i*3)) // 3비트씩 오른쪽으로 이동하며 실행권한을 갖는지 확인
*p = 'x';
p++;
}
if((mode & S_ISUID) != 0) // set-user-id-on-execution 비트인지 확인
perms[2] = 's';
if((mode & S_ISGID) != 0) // set-group-id-on-execution 비트인지 확인
perms[5] = 's';
if((mode & S_ISVTX) != 0) // sticky 비트인지 확인
perms[8] = 't';
return(perms);
}
● 예제 5.1
● 예제 5.2
// 입력받은 인자값 디렉토리 경로를 dirname에 저장
dirname = argv[i];
}
// dirname이 가리키는 디렉토리를 읽기 전용으로 연다
if((dp=opendir(dirname)) == NULL){ // 만약 열수 없다면 에러출력
perror(dirname);
exit(1);
}
printf("%s:\n", dirname); // dirname 를 출력
// dp에서 다음 디렉토리 엔트리를 dirent 구조체를 가리키는 d에 저장한다
while((d=readdir(dp))!= NULL){ // 디렉토리 파일의 끝을 만날 때 까지 실행
switch(option){ // 옵션에 내용에 따라 출력형태를 달리한다.
case 'l': // l 일 경우 디렉토리에 있는 파일명을 리스트화하여 출력
// filename에 파일의 절대경로/파일이름을 저장한다
sprintf(filename, "%s/%s", dirname, d->d_name);
if(lstat(filename, &st)<0){
// filename이 가리키는 파일정보를 stat구조체 st에 저장
perror(filename);
putchar('\n');
continue;
}
outputStatInfo(filename, d->d_name, &st);
putchar('\n');
break;
case 'p': // 옵션이 p인 경우 파일명 출력
printf("%s ", d->d_name);
break;
case 'z':
// 옵션이 z이면(-l, -p) 입력받은 디렉토리에 있는 파일명을 리스트화 하여 출력
sprintf(filename, "%s/%s", dirname, d->d_name);
if(lstat(filename, &st)<0){
perror(filename);
putchar('\n');
continue;
}
// 파일정보를 출력해주는 함수 호출
outputStatInfo(filename, d->d_name, &st);
putchar('\n');
break;
case 'n': // 옵션이 없는 경우 현재 파일명만 출력
printf("%s ", d->d_name);
break;
}
}
putchar('\n');
closedir(dp);
exit(0);
}
}while(argc--);
}
□ outputStatInfo.c
void outputStatInfo(char *pathname, char *filename, struct stat *st){
int n;
char slink[BUFSIZ+1];
printf("%5d ", st->st_blocks); // 파일시스템 블록 수 출력
printf("%c%s ", typeOfFile(st->st_mode), permOfFile(st->st_mode)); // 파일의 타입과 권한비트 출력
printf("%3d ", st->st_nlink); // 파일의 링크 수 출력
printf("%5d/%-5d ", st->st_uid, st->st_gid); // 파일의 사용자 아이디와 그룹 아이디 출력
// 장치파일일 경우 주/부 장치 번호를 출력하고 그렇지 않은 경우 파일 크기를 출력한다
if(((st->st_mode & S_IFMT) != S_IFCHR) && ((st->st_mode & S_IFMT) != S_IFBLK))
printf("%9d ", st->st_size)
else
printf("%4d,%4d ", major(st->st_rdev), minor(st->st_rdev));
// 접근 시간을 출력한다
printf("%.12s ", ctime(&st->st_mtime)+4);
printf("%s", filename); // 파일 이름 출력
// 만약 심볼릭 링크라면 무엇을 가리키고 있는지 출력 한다
if((st->st_mode & S_IFMT)==S_IFLNK){
if((n=readlink(pathname, slink, sizeof(slink)))<0)
printf(" -> ???");
else
printf(" -> %.*s", n, slink);
}
}
□ typeOfFile.c
char typeOfFile(mode_t mode){
switch(mode & S_IFMT){ // 파일의 형식을 알아낸다
case S_IFREG: // 일반파일
return('-');
case S_IFDIR: // 디렉토리
return('d');
case S_IFCHR: // 문자 특수 장치 파일
return('c');
case S_IFBLK: // 블록 특수 장치 파일
return('b');
case S_IFLNK: // 심볼릭 링크 파일
return('l');
case S_IFIFO: // FIFO 파일
return('p');
case S_IFSOCK: // 유닉스 도메인 소켓
return('s');
}
}
□ permOfFile.c
char * permOfFile(mode_t mode){
int i;
char *p;
static char perms[10];
p=perms;
strcpy(perms, "---------");
for(i=0;i<3;i++){
if(mode&(S_IREAD >> i*3)) // 3비트씩 오른쪽으로 이동하며 읽기권한을 갖는지 확인
*p='r';
p++;
if(mode & (S_IWRITE>>i*3)) // 3비트씩 오른쪽으로 이동하며 Tm기 권한을 갖는지 확인
*p='w';
p++;
if(mode & (S_IEXEC >> i*3)) // 3비트씩 오른쪽으로 이동하며 실행권한을 갖는지 확인
*p = 'x';
p++;
}
if((mode & S_ISUID) != 0) // set-user-id-on-execution 비트인지 확인
perms[2] = 's';
if((mode & S_ISGID) != 0) // set-group-id-on-execution 비트인지 확인
perms[5] = 's';
if((mode & S_ISVTX) != 0) // sticky 비트인지 확인
perms[8] = 't';
return(perms);
}
● 예제 5.1
● 예제 5.2