PintOS_Project02_ArgumentPassing_Parsing

전두엽힘주기·2025년 5월 19일

PintOS

목록 보기
8/20
post-thumbnail

"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로 잘 확인 되었는지 확인해보자

(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"

1개의 댓글

comment-user-thumbnail
2025년 5월 19일

부럽다 난 ㅙ 안돼

답글 달기