first_child는 파이프라인의 첫 번째 자식 프로세스를 처리합니다.
표준 출력 리다이렉션:
dup2(pipex.tube[1], 1);
파이프의 쓰기 끝(tube)을 표준 출력(파일 디스크립터 1)으로 복제합니다.
이로 인해 이 프로세스의 모든 출력은 파이프로 전송됩니다.
파이프 읽기 끝 닫기:
close(pipex.tube[0]);
파이프의 읽기 끝을 닫습니다. 이 프로세스는 파이프에 쓰기만 하므로 읽기 끝은 필요 없습니다.
표준 입력 리다이렉션:
dup2(pipex.infile, 0);
pipex.infile(입력 파일의 파일 디스크립터)을 표준 입력(파일 디스크립터 0)으로 복제합니다.
이로 인해 프로세스는 지정된 입력 파일에서 데이터를 읽게 됩니다.
명령어 인자 분리:
pipex.cmd_args = ft_split(argv[2], ' ');
argv(첫 번째 명령어 문자열)를 공백을 기준으로 분리하여 인자 배열을 생성합니다.
명령어 전체 경로 찾기:
pipex.cmd = get_cmd(pipex.cmd_paths, pipex.cmd_args[0]);
get_cmd 함수를 사용하여 명령어의 전체 경로를 찾습니다.
명령어 검증 및 에러 처리:
if (!pipex.cmd)
{
child_free(&pipex);
msg(ERR_CMD);
exit(1);
}
명령어를 찾지 못한 경우, 할당된 메모리를 해제하고 에러 메시지를 출력한 후 프로세스를 종료합니다.
새 프로그램 실행:
execve(pipex.cmd, pipex.cmd_args, envp);
execve 함수를 사용하여 찾은 명령어를 실행합니다.
이 함수가 성공하면 현재 프로세스는 새 프로그램으로 완전히 대체됩니다.
이 함수는 파이프라인의 첫 번째 명령어를 실행하기 위한 모든 준비를 수행하고, 실제로 명령어를 실행합니다. 입력 파일에서 데이터를 읽어 파이프로 출력하는 역할을 합니다.
이 함수 second_child는 파이프라인의 두 번째 자식 프로세스를 처리합니다. 첫 번째 자식 프로세스와 유사하지만, 입출력 처리 방식에 차이가 있습니다.
표준 입력 리다이렉션:
dup2(pipex.tube[0], 0);
파이프의 읽기 끝(tube)을 표준 입력(파일 디스크립터 0)으로 복제합니다.
이로 인해 이 프로세스는 파이프로부터 데이터를 읽게 됩니다.
파이프 쓰기 끝 닫기:
close(pipex.tube[1]);
파이프의 쓰기 끝을 닫습니다. 이 프로세스는 파이프에서 읽기만 하므로 쓰기 끝은 필요 없습니다.
표준 출력 리다이렉션:
dup2(pipex.outfile, 1);
pipex.outfile(출력 파일의 파일 디스크립터)을 표준 출력(파일 디스크립터 1)으로 복제합니다.
이로 인해 프로세스의 출력은 지정된 출력 파일로 전송됩니다.
명령어 인자 분리:
pipex.cmd_args = ft_split(argv[3], ' ');
argv(두 번째 명령어 문자열)를 공백을 기준으로 분리하여 인자 배열을 생성합니다.
명령어 전체 경로 찾기:
pipex.cmd = get_cmd(pipex.cmd_paths, pipex.cmd_args[0]);
get_cmd 함수를 사용하여 명령어의 전체 경로를 찾습니다.
명령어 검증 및 에러 처리:
if (!pipex.cmd)
{
child_free(&pipex);
msg(ERR_CMD);
exit(1);
}
명령어를 찾지 못한 경우, 할당된 메모리를 해제하고 에러 메시지를 출력한 후 프로세스를 종료합니다.
새 프로그램 실행:
execve(pipex.cmd, pipex.cmd_args, envp);
execve 함수를 사용하여 찾은 명령어를 실행합니다.
이 함수가 성공하면 현재 프로세스는 새 프로그램으로 완전히 대체됩니다.
이 함수는 파이프라인의 두 번째 명령어를 실행하기 위한 모든 준비를 수행하고, 실제로 명령어를 실행합니다. 파이프로부터 데이터를 읽어 출력 파일로 결과를 전송하는 역할을 합니다.
첫 번째 자식 프로세스와의 주요 차이점은 입력을 파이프에서 받고 출력을 파일로 보낸다는 점입니다. 이를 통해 두 명령어가 파이프를 통해 연결되어 데이터를 주고받을 수 있게 됩니다.
'C Language' 카테고리의 다른 글
3차원 프로젝트에서 z 값에 대해서만 min_z를 두는 이유 (0) | 2025.01.21 |
---|---|
부모 프로세스와 자식 프로세스의 free 알고리즘 차이 (0) | 2025.01.21 |
get_cmd: cmd의 전체 경로 찾는 함수 (0) | 2025.01.21 |
STDIN_FILENO 의 정의 (0) | 2025.01.21 |
파이프 구조 및 여러개의 파이프 연결방법 (0) | 2025.01.21 |