Trace07은 built-in 명령어 jobs를 구현하는 문제입니다. jobs 명령어는 현재 실행 중인 작업들의 리스트를 출력해주는 함수입니다.
실행 중인 작업들의 리스트를 출력해주는 함수는 tsh.c 내부에 listjobs()로 구현이 되어있습니다.
먼저 listjobs 함수를 살펴보겠습니다.
void listjobs(struct job_t *jobs, int output_fd); 함수 헤더를 살펴보니 paremeter로 jobs배열과 file_descriptor 를 받는 것을 알 수 있습니다.
이미 글로벌 변수로 jobs를 선언해 준 것이 있으니 첫번째 인자로는 jobs를 넣어주면 될 것 같고 file descriptor는 원래 프로세스가 파일을 다룰 때 사용하는 추상적인 값이지만 어떤 파일을 다뤄야 할 지 모르겠으니 적당한 정수를 넣어주도록 하겠습니다.
다시 한번 쉘의 기본구조를 생각해보겠습니다. main 함수에서 cmdline에 유저가 입력한 명령어를 저장하고 eval(cmdline)을 통해 명령어를 해독합니다.
그리고 eval 함수에서 명령어가 built-in 명령어인지 Utility 명령어인지 판별합니다. 우리가 구현하고자 하는 jobs 명령어는 built-in 명령어라고 했으므로 builtin_cmd(argv)의 리턴값이 참이되도록 builtin_cmd 함수를 정의해주어야 합니다. 이것은 trace01에서 구현했던 quit과 거의 유사하게 구성해주면 됩니다.
+ 수정사항
Standard library에 정의된 것으로
STDIN : 0
STDOUT : 1
STDERR : 2
최종코드
int builtin_cmd(char **argv)
{
char *cmd = argv[0];
if (!strcmp(cmd, "quit")) {
/* quit command */
exit(0);
} else if (!strcmp(cmd, "jobs")) {
int fd = 1; // fileDescriptor 1 : STDOUT
listjobs(jobs, fd);
return 1;
}
return 0;
}
실행결과
'시스템 프로그래밍' 카테고리의 다른 글
[Shell lab] Trace 08, Trace 10, Trace 11 (0) | 2022.11.23 |
---|---|
[System Programming] Shell (1) | 2022.11.22 |
[Shell Lab] Trace05, Trace 06 (0) | 2022.11.15 |
[Shell Lab] Trace02, Trace03, Trace04 (0) | 2022.11.15 |
[Shell Lab] Trace01 (0) | 2022.11.15 |