"args-many a b c d e f g"
파일 네임 args-many
process_exec() 에서 load()함수 전에 구현하면 된다
깃북을 보면
어떻게 해야할지 모르겠다면 strtok_r()함수를 참고하라고 한다.
strtok_r()는 문자열을 구분자로 잘라서 토큰을 하나씩 꺼내는 함수다.
처음에는 자를 문자열을 넣고, 이후부터는 NULL을 넣으면 이전 위치부터 이어서 잘라준다.
이때 save_ptr 포인터가 어디까지 잘랐는지 기억하는 역할을 한다.
여러 개의 구분자가 연속되어 있어도 하나처럼 처리하고,
빈 문자열은 건너뛴다. 즉, 토큰의 길이는 항상 1 이상이다.
이 함수는 문자열을 직접 수정하면서 자르기 때문에,
문자열 리터럴이 아닌 char 배열처럼 수정 가능한 문자열을 써야 한다.
⸻
int
process_exec (void *f_name) {
char *file_name = f_name;
bool success;
...
////////////////////////////////////////////////////////////////////////
char *argv[64];
int argc=0;
char *token;
char *save_pointer;
token=strtok_r(file_name, " ", &save_pointer);
while(token !=NULL) {
argv[argc]=token;
token=strtok_r(NULL, " ", &save_pointer);
argc++;
}
/* And then load the binary */
success = load (file_name, &_if);
...
}
(gdb) b process_exec
Breakpoint 1 at 0x800421b3cf: file ../../userprog/process.c, line 164.
...
(gdb) print file_name
$2 = 0x80042b5000 "args-many a b c d e f g"
파싱 전 파일 네임 프린트 해보면 "args-many a b c d e f g"라고 뜸
(gdb) n
183 int argc=0;
(gdb) n
188 token=strtok_r(file_name, " ", &save_pointer);
(gdb) n
189 while(token !=NULL) {
(gdb) n
190 argv[argc]=token;
(gdb) n
191 token=strtok_r(NULL, " ", &save_pointer);
(gdb) n
192 argc++;
(gdb) n
189 while(token !=NULL) {
(gdb) print file_name
$4 = 0x80042b5000 "args-many"
잘 뜬다
(gdb) print argv
$21 = {0x80042b5000 "args-many", 0x80042b500a "a", 0x80042b500c "b", 0x80042b500e "c", 0x80042b5010 "d",
0x80042b5012 "e", 0x80042b5014 "f", 0x80042b5016 "g", 0x0 <repeats 56 times>}
(gdb) print argc
$22 = 8
(gdb) print file_name
$24 = 0x80042b5000 "args-many"
부럽다 난 ㅙ 안돼