정글사관학교 개발일지/운영체제-PintOS

PintOS Project 2 - User Program (9) System Call(정글사관학교 72일차 TIL) - 프로세스 관련 system call 구현(exec(), wait())

Woonys 2022. 1. 11. 10:42
반응형

미쳤다..fork() 하나로 이틀을 날리다니.. 오늘이 제발 마지막이기를.. 바로 간다.

 

exec() 구현

int exec (const char *cmd_line);

Change current process to the executable whose name is given in cmd_line, passing any given arguments.
(현재 프로세스를 주어진 인자와 함께 커맨드 라인으로 주어진 이름을 갖는 실행 파일로 바꿔라.)
This never returns if successful. Otherwise the process terminates with exit state -1, if the program cannot load or run for any reason.
(이 함수는 성공시 어떤 값도 리턴하지 않는다. 그렇지 않다면(=실패했다면) 프로세스는 exit(-1)과 함께 종료된다. 이 경우는 어떤 이유로 인해 프로그램이 load 혹은 run하지 못했을 때이다.

This function does not change the name of the thread that called exec. Please note that file descriptors remain open across an exec call.
(이 함수는 exec 스레드 이름을 바꾸지 않는다. 파일 디스크립터는 exec call에도 open을 유지해야 한다는 것을 명심하라.

 

exec() 함수는 현재 프로세스를 명령어로 입력 받은 실행 파일로 변경하는 함수이다.

 

가장 먼저 인자로 받은 file_name 주소의 유효성을 확인한다. 이후, palloc_get_page() 함수와 strlcpy() 함수를 이용하여 file_name을 fn_copy로 복사한다. 이는 caller 함수와 load() 사이 race condition을 방지하기 위하여 전달된 인자를 복사하는 것이며, 이어서 process_exec() 함수를 호출하여 해당 프로세스를 메모리에 load()하고 정보를 스택에 쌓는다. 오류 발생시 -1을 반환한다.

 

 

int exec(char *file_name){
	check_address(file_name);

	int size = strlen(file_name) + 1;
	char *fn_copy = palloc_get_page(PAL_ZERO);
	if ((fn_copy) == NULL) {
		exit(-1);
	}
	strlcpy(fn_copy, file_name, size);

	if (process_exec(fn_copy) == -1) {
		return -1;
	}

	NOT_REACHED();
	return 0;
	
}

 

 

wait() 구현

와 진짜 마지막..근데 이쯤되니 그냥 따라 치는 수준..솔직히 fork() 다음부터는 머릿속에 잘 안 들어온다..하..

int wait (tid_t pid)
{
	process_wait(pid);
};

 

 

int process_wait (tid_t child_tid UNUSED) {
	/* XXX: Hint) The pintos exit if process_wait (initd), we recommend you
	 * XXX:       to add infinite loop here before
	 * XXX:       implementing the process_wait. */

	struct thread *cur = thread_current();
	struct thread *child = get_child_with_pid(child_tid);

	if (child == NULL)
		return -1;
	
	sema_down(&child->wait_sema); 
	int exit_status = child->exit_status;
	list_remove(&child->child_elem);
	sema_up(&child->free_sema);

	return exit_status;
}

 

*막간 정리

 

stack 관련 질문: stack은 언제 할당받을까?

 

A: stack의 크기는 compile time에 확정되지만 실제로 stack에 함수 정보가 쌓이는 건 runtime일 때다.

참조 링크: https://stackoverflow.com/questions/10822176/is-the-stack-memory-allocated-at-runtime-or-compile-time

 

스택 관련 정리: 스택에는 함수의 리턴 정보가 쌓인다.

 

 

반응형