Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- VS Code
- Docker
- Numpy
- Linux
- 오류
- pip
- 핑거스타일
- C
- 기타 연주
- SSH
- Visual Studio
- pytorch
- error
- label
- Python
- 명령어
- YOLO
- mysql
- C++
- JSON
- windows forms
- C#
- ubuntu
- LIST
- Selenium
- OpenCV
- paramiko
- 프로그래머스
- pandas
- 채보
Archives
- Today
- Total
기계는 거짓말하지 않는다
Linux ls 명령어 구현 (2) 본문
lsPipe 함수는 fork를 이용하여 자식 프로세스를 생성하고
dup2 함수를 이용하여 파일 디스크립터를 복제한다.
그리고 execl 함수에 디렉터리 path를 넘겨받는다.
execlp 함수에서 command를 받는다.
void lsPipe(char * dirpath, char * command, char * otherop) {
int pid1, pid2, fd[2], status;
if(pipe(fd) == -1) {
perror("pipe");
exit(1);
}
pid1 = fork();
if(pid1 == 0) { // 자식 프로세스 생성
...
}
else {
pid2 = fork();
if(pid2 == 0) {
...
}
else {
close(fd[0]);
close(fd[1]);
waitpid(pid1, &status, 0);
waitpid(pid2, &status, 0);
}
}
exit(0);
}
maxWidthCalc 함수는 세부정보 출력시 숫자가 차지하는 너비를 계산하기 위해 필요하다.
setInfo 함수에서 파일 타입, 권한, 링크 수, 시간 등등을 설정한다.
void setInfo(info_set * info, char * path, char * name) {
struct stat buf;
struct passwd * pwd;
struct group * grp;
struct tm *t;
int chk = 0;
char temp[512];
if (lstat(path, &buf) == -1)
{
perror("Error: ");
exit(1);
}
if (S_ISDIR(buf.st_mode)) // 파일 타입 결정
info->permission[0] = 'd';
else if (S_ISCHR(buf.st_mode))
info->permission[0] = 'c';
else if (S_ISBLK(buf.st_mode))
info->permission[0] = 'b';
else if (S_ISFIFO(buf.st_mode))
info->permission[0] = 'p';
else if (S_ISSOCK(buf.st_mode))
info->permission[0] = 's';
else if (S_ISLNK(buf.st_mode))
info->permission[0] = 'l';
else
info->permission[0] = '-';
info->permission[1] = ((buf.st_mode & S_IRUSR) != 0 ? 'r' : '-'); // 권한 문자 지정
info->permission[2] = ((buf.st_mode & S_IWUSR) != 0 ? 'w' : '-');
info->permission[3] = ((buf.st_mode & S_IXUSR) != 0 ? 'x' : '-');
if(buf.st_mode & S_ISUID) info->permission[3] = 'S';
info->permission[4] = ((buf.st_mode & S_IRGRP) != 0 ? 'r' : '-');
info->permission[5] = ((buf.st_mode & S_IWGRP) != 0 ? 'w' : '-');
info->permission[6] = ((buf.st_mode & S_IXGRP) != 0 ? 'x' : '-');
if(buf.st_mode & S_ISGID) info->permission[6] = 'S';
info-> permission[7] = ((buf.st_mode & S_IROTH) != 0 ? 'r' : '-');
info-> permission[8] = ((buf.st_mode & S_IWOTH) != 0 ? 'w' : '-');
info-> permission[9] = ((buf.st_mode & S_IXOTH) != 0 ? 'x' : '-');
if(buf.st_mode & S_ISVTX) info->permission[9] = 'T';
info->permission[10] = '\0';
pwd = getpwuid(buf.st_uid);
grp = getgrgid(buf.st_gid);
info->link = buf.st_nlink; // 링크 수
info->UID = pwd->pw_name; // 소유자ID
info->GID = grp->gr_name; // 그룹ID
...
}
lsRecurse 함수는 -R 옵션을 이용할 때 재귀적으로 함수를 호출하여 모든 파일을 출력한다.
실행 결과
'Linux' 카테고리의 다른 글
Linux Watch 명령어(명령어 결과 출력 반복 실행) (0) | 2022.05.25 |
---|---|
Ubuntu 18.04 LTS Install OpenCV (0) | 2022.04.15 |
Linux ls 명령어 구현 (1) (2) | 2021.08.17 |
Linux VI Editor 기타 명령어 (0) | 2021.06.30 |
Linux VI Editor 검색, 문자열 변경 명령어 (0) | 2021.06.30 |
Comments