우선은 부모 프로세스에서 실행할 함수이다.
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->outfile
과pipex->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->infile
과pipex->pipfd[1]
은 더이상 사용하지 않기 때문에 닫음- 커맨드 실행
- 자원 해제 후 포인터 초기화
위 두 함수를 통해 부모와 자식 프로세스에 연결된 파이프에 대해 관리를 한다.
자식 프로세스의 경우 파일에서 읽은 값에 대한 결과를 부모에 보내주어야하는데 이 때, infile을 입력에 복사하고, 출력은 표준 출력에 복사시킨다.
부모의 경우 반대로 진행해 진행한다.
이 두함수와 첫 글의 mian함수를 통해 프로세스를 복사, 내용을 교체하여 여러 프로세스들의 실행순서등을 효과적으로 제어 및 실행할 수 있게한다.
'42 > PIPEX' 카테고리의 다른 글
[PIPEX / C] Utils & SanityCheck Funcs 구현 (1) | 2024.03.23 |
---|---|
[PIPEX / C] 메인 함수 흐름 및 fork()-wait()에 대하여 (0) | 2024.03.23 |