본문 바로가기

C Language

부모 프로세스와 자식 프로세스의 free 알고리즘 차이

부모 프로세스 free

free_parent 함수:
파일 디스크립터 닫기:
close(pipex->infile);
close(pipex->outfile);

 

부모 프로세스는 입력 파일과 출력 파일의 파일 디스크립터를 관리합니다. 이들을 닫아 리소스를 해제합니다.
cmd_paths 해제:
while (pipex->cmd_paths[i])
{
    free(pipex->cmd_paths[i]);
    i++;
}

 

free(pipex->cmd_paths);
cmd_paths는 환경 변수 PATH에서 추출한 디렉토리 경로들의 배열입니다. 이는 부모 프로세스에서 한 번 할당되어 모든 자식 프로세스에서 공유됩니다. 따라서 부모 프로세스에서 해제합니다.

 

자식 프로세스 free

free_child 함수:
cmd_args 해제:

while (pipex->cmd_args[i])
{
    free(pipex->cmd_args[i]);
    i++;
}
free(pipex->cmd_args);

 

cmd_args는 각 명령어의 인자들을 저장하는 배열입니다. 이는 각 자식 프로세스마다 다르게 할당되므로, 자식 프로세스에서 해제합니다.

 

cmd 해제:
free(pipex->cmd);
cmd는 실행할 명령어의 전체 경로를 저장합니다. 이 또한 각 자식 프로세스마다 다르게 할당되므로, 자식 프로세스에서 해제합니다.

 

주요 차이점:
파일 디스크립터: 부모 프로세스만 닫습니다. 자식 프로세스는 execve 호출 후 새 프로그램으로 대체되므로 별도로 닫을 필요가 없습니다.
cmd_paths: 모든 프로세스에서 공유되므로 부모 프로세스에서만 해제합니다.
cmd_args와 cmd: 각 자식 프로세스마다 다르게 할당되므로 자식 프로세스에서 해제합니다.
이러한 구조는 메모리 누수를 방지하고 리소스를 효율적으로 관리하기 위한 것입니다.

 

  1. 부모 프로세스:
    • 명령어를 찾을 수 있는 모든 가능한 경로들(PATH 환경 변수에서 추출)을 관리합니다.
    • 이는 pipex->cmd_paths에 저장됩니다.
    • 이 정보는 모든 자식 프로세스에서 공유될 수 있는 정보입니다.
  2. 자식 프로세스:
    • 실제 실행할 특정 명령어와 그 인자들을 관리합니다.
    • pipex->cmd: 실행할 명령어의 전체 경로 (예: "/bin/ls")
    • pipex->cmd_args: 명령어와 그 인자들의 배열 (예: {"ls", "-l", "/home", NULL})

자식 프로세스는 부모로부터 받은 경로 정보(cmd_paths)를 사용하여 실제 실행할 명령어의 전체 경로(cmd)를 찾고, 이를 인자들(cmd_args)과 함께 사용하여 새 프로그램을 실행합니다.이러한 구조는 효율성과 유연성을 위한 것입니다. 부모 프로세스가 모든 가능한 경로를 한 번만 찾아두면, 여러 자식 프로세스들이 이 정보를 재사용할 수 있기 때문입니다.

 

  1. cmd_paths:
    • 이는 실행 가능한 프로그램들을 찾을 수 있는 모든 디렉토리 경로들의 배열입니다.
    • 예: {"/usr/local/bin", "/usr/bin", "/bin", NULL}
    • PATH 환경 변수에서 추출한 경로들입니다.
  2. cmd:
    • 이는 실제 실행할 특정 명령어의 전체 경로입니다.
    • 예: "/bin/ls"
    • cmd_paths의 경로들을 검색하여 찾은 실제 실행 파일의 경로입니다.

cmd cmd_paths의 경로들을 이용해 찾은 결과입니다. 예를 들어, "ls" 명령어를 실행하려 할 때:

  1. cmd_paths에 있는 각 경로를 순회합니다.
  2. 각 경로에 "ls"를 붙여 실행 가능한 파일이 있는지 확인합니다.
  3. "/bin/ls"가 존재하고 실행 가능하다면, 이를 cmd에 저장합니다.

따라서 cmd_paths는 가능한 모든 경로를 포함하고, cmd는 그 중 실제 사용할 하나의 특정 경로를 나타냅니다.