본문 바로가기
42/PIPEX

[ PIPEX / C ] 부모-자식 프로세스에서 실행할 함수 구현

by 블로블로글 2024. 3. 23.

우선은 부모 프로세스에서 실행할 함수이다.

void    change_fd_parent(t_pipex *pipex, char *argv[], char **envp)
{
    pipex->cmd = ft_split(argv[3], ' ');
    close(pipex->pipefd[1]);
    dup2(pipex->pipefd[0], STDIN_FILENO);
    dup2(pipex->outfile, STDOUT_FILENO);
    close(pipex->outfile);
    close(pipex->pipefd[0]);
    execute_cmd(pipex, envp);
    free(pipex->cmd);
    pipex->cmd = 0;
}
  • 인자로 받은 명령어를 split으로 공백 구분 후 결과를 cmd에 저장
  • close를 통해 파이프의 쓰기를 닫음
  • dup2를 사용해 pipex->pipfd[0]을 표준 입력으로 바꿈
  • dup2를 사용해 pipex->outfile을 표준 출력으로 바꿈
  • pipex->outfilepipex->pipfd[0]은 더이상 사용하지 않기 때문에 닫음
  • 커맨드 실행
  • 자원 해제 후 포인터 초기화
void    change_fd_children(t_pipex *pipex, char *argv[], char **envp)
{
    pipex->cmd = ft_split(argv[2], ' ');
    close(pipex->pipefd[0]);
    dup2(pipex->infile, STDIN_FILENO);
    dup2(pipex->pipefd[1], STDOUT_FILENO);
    close(pipex->infile);
    close(pipex->pipefd[1]);
    execute_cmd(pipex, envp);
    free(pipex->cmd);
    pipex->cmd = 0;
}
  • 인자로 받은 명령어를 split으로 공백 구분 후 결과를 cmd에 저장
  • close를 통해 파이프의 읽기를 닫음
  • dup2를 사용해 pipex->pipfd[1]을 표준 출력으로 바꿈
  • dup2를 사용해 pipex->infile을 표준 입력으로 바꿈
  • pipex->infilepipex->pipfd[1]은 더이상 사용하지 않기 때문에 닫음
  • 커맨드 실행
  • 자원 해제 후 포인터 초기화

위 두 함수를 통해 부모와 자식 프로세스에 연결된 파이프에 대해 관리를 한다.
자식 프로세스의 경우 파일에서 읽은 값에 대한 결과를 부모에 보내주어야하는데 이 때, infile을 입력에 복사하고, 출력은 표준 출력에 복사시킨다.
부모의 경우 반대로 진행해 진행한다.

이 두함수와 첫 글의 mian함수를 통해 프로세스를 복사, 내용을 교체하여 여러 프로세스들의 실행순서등을 효과적으로 제어 및 실행할 수 있게한다.