6/3 Argument Passing

JK·2023년 6월 4일

Argument Passing

PintOS에서 Argument Passing은 프로세스가 실행될 때 프로그램 이름과 인자들을 전달하는 메커니즘을 의미합니다. 이를 통해 실행 중인 프로세스는 명령행에서 인자로 전달된 값을 사용할 수 있습니다. 아래에서 Argument Passing이 어떻게 이루어지는지 간단히 설명하겠습니다.

  1. 프로그램 실행 준비:
  • 사용자가 PintOS에서 실행할 프로그램 이름과 인자들을 지정합니다.
  • process_create_initd()와 같은 함수를 호출하여 새로운 프로세스를 생성합니다.
  1. 프로세스 생성:
  • process_create_initd() 함수는 새로운 프로세스를 생성하고 프로그램을 실행할 준비를 합니다.
  • 프로세스 생성 시에는 프로세스의 메모리 공간을 할당하고, 프로그램을 메모리에 탑재(load)합니다.
  • 이 때, load() 함수가 호출되며 프로그램을 메모리로 읽어오고 실행 가능한 상태로 만듭니다.
  1. 인자 전달:
  • 프로그램이 메모리에 로드된 후, 인자들을 유저 스택에 저장합니다.
  • argument_stack() 함수나 유사한 방법을 사용하여 인자들을 스택에 저장합니다.
  • 일반적으로 문자열 배열을 사용하여 각각의 인자들을 저장하게 됩니다.
  1. 프로그램 실행:
  • 인자들이 유저 스택에 저장된 후, 프로세스는 메인 함수 또는 진입점(entry point)으로 이동하여 실행을 시작합니다.
  • 프로그램은 실행 중에 스택에서 인자들을 읽어와 필요한 작업을 수행할 수 있습니다.
  • 예를 들어, 명령행 인자들을 프로그램에서 활용하여 특정 동작을 수행하거나 설정 값을 변경할 수 있습니다.

Argument Passing은 프로세스 간 정보 공유와 사용자 입력을 받아들이는 등의 다양한 시나리오에서 유용하게 활용될 수 있습니다. 인자들을 명확하게 전달하고 프로세스가 필요한 값을 액세스할 수 있도록 하는 것은 프로그램의 유연성과 기능성을 높일 수 있는 중요한 요소입니다


오늘은 오후에 본가에 다녀오느라 길게 공부하지 못해서 수정한 코드부분을 올리겠습니다

static bool
load (const char *file_name, struct intr_frame *if_) {

	...

	/* TODO: Your code goes here.
	 * TODO: Implement argument passing (see project2/argument_passing.html). */
	char *arg_list[128];      // 인자를 저장할 배열
	char *token, *save_ptr;   // 토큰화를 위한 변수들
	int token_count = 0;      // 토큰의 개수를 세는 카운터

	token = strtok_r(file_name, " ", &save_ptr); // 첫 번째 인자를 토큰화
	arg_list[token_count] = token;  // 토큰을 인자 배열에 저장

	while(token!=NULL){
		token = strtok_r(NULL, " ", &save_ptr);  // 다음 토큰을 토큰화
		token_count++;
		arg_list[token_count] = token;  // 토큰을 인자 배열에 저장
	}
    
    ...

위의 코드는 file_name 문자열을 공백을 기준으로 분리하여 arg_list 배열에 저장하는 과정을 나타내고 있습니다. 각 줄의 코드를 설명하면 다음과 같습니다:

char *arg_list[128];
  • arg_list는 문자열 포인터 배열로, 인자들을 저장하기 위한 배열입니다. 최대 128개의 인자를 저장할 수 있습니다.
char *token, *save_ptr;
  • token은 strtok_r 함수를 사용하여 분리된 인자를 임시로 저장하기 위한 포인터입니다.
  • save_ptr은 strtok_r 함수가 다음 호출 시에 사용할 위치 정보를 저장하기 위한 포인터입니다.
token = strtok_r(file_name, " ", &save_ptr);
  • strtok_r 함수를 사용하여 file_name 문자열을 공백을 기준으로 첫 번째 토큰을 분리하고 그 포인터를 token에 저장합니다.
  • strtok_r 함수는 첫 번째 호출 시에는 분리할 문자열을 전달하고, 이후 호출 시에는 NULL을 전달하여 다음 토큰을 분리합니다.
arg_list[token_count] = token;
  • 분리된 토큰(token)을 arg_list 배열의 token_count 인덱스에 저장합니다.
  • 이렇게 함으로써 분리된 인자들이 순서대로 arg_list 배열에 저장됩니다.
while(token!=NULL) { ... }
  • 이전 단계에서 첫 번째 토큰을 분리한 후, 이제 while 루프를 통해 나머지 토큰들을 분리하고 저장합니다.
  • strtok_r(NULL, " ", &save_ptr)를 호출하여 다음 토큰을 분리하고 그 포인터를 token에 저장합니다.
  • 토큰이 NULL이 아닌 동안에는 반복하여 토큰을 분리하고 arg_list 배열에 저장합니다.

이렇게 코드를 실행하면 file_name 문자열을 공백을 기준으로 분리하여 arg_list 배열에 각각의 인자들이 저장되게 됩니다. 예를 들어, 만약 file_name이 "hello world pintos"라면, arg_list[0]에는 "hello", arg_list[1]에는 "world", arg_list[2]에는 "pintos"가 저장됩니다. 이후 arg_list 배열을 활용하여 인자들을 필요로 하는 다른 코드로 전달할 수 있습니다.

코드가 완성이 아니라서 언제든지 수정될 수 있고 수정 된다면 다시 올리겠습니다 :)

profile
^^

0개의 댓글