child와 parent의 관계
- child 프로세스:
- d->child는 현재 생성 중인 자식 프로세스의 인덱스를 나타냅니다. 이 값은 0부터 시작하여 d->nb_cmds (명령어의 개수)보다 작을 때까지 증가합니다.
- fork() 호출 후, 자식 프로세스는 d->pids[d->child] == 0 조건을 만족하게 됩니다. 이 경우, child(d) 함수를 호출하여 자식 프로세스의 작업을 수행합니다. 자식 프로세스는 주로 명령어를 실행하는 역할을 합니다.
- parent 프로세스:
- parent(d) 함수는 모든 자식 프로세스가 생성된 후 부모 프로세스에서 호출됩니다. 이 함수는 자식 프로세스의 종료를 기다리거나, 자식 프로세스의 결과를 처리하는 등의 작업을 수행합니다.
- 부모 프로세스는 fork() 호출 후, 자식 프로세스의 PID를 d->pids[d->child]에 저장하고, 자식 프로세스가 생성된 후 계속해서 다음 명령어를 처리합니다.
자식 프로세스의 개수
- d->nb_cmds: 이 변수는 실행할 명령어의 총 개수를 나타냅니다. 이 값은 pipex 함수가 호출될 때 인수로 전달된 명령어의 개수에 해당합니다.
- d->child: 이 변수는 현재 생성 중인 자식 프로세스의 인덱스를 나타내며, 0부터 시작하여 d->nb_cmds - 1까지 증가합니다. 따라서, 루프가 종료될 때까지 d->child는 d->nb_cmds와 같아지지 않으며, 최종적으로 생성되는 자식 프로세스의 개수는 d->nb_cmds와 같습니다.
전체 흐름
- 명령어 분리: ft_split 함수를 사용하여 현재 명령어를 공백으로 분리하여 d->cmd_options에 저장합니다.
- 명령어 경로 가져오기: get_cmd 함수를 호출하여 명령어의 경로를 찾습니다.
- 자식 프로세스 생성: fork()를 호출하여 새로운 자식 프로세스를 생성합니다. 이때, 자식 프로세스의 PID는 d->pids[d->child]에 저장됩니다.
- 자식 프로세스 작업 수행: 자식 프로세스인 경우 child(d) 함수를 호출하여 명령어를 실행합니다.
- 메모리 해제: 사용이 끝난 명령어 경로와 옵션을 메모리에서 해제합니다.
- 자식 프로세스 수 증가: d->child를 증가시켜 다음 자식 프로세스를 준비합니다.
- 부모 프로세스 처리: 모든 자식 프로세스가 생성된 후, parent(d) 함수를 호출하여 부모 프로세스의 작업을 수행합니다.
요약
- child 프로세스는 명령어를 실행하는 역할을 하며, parent 프로세스는 자식 프로세스의 종료를 관리합니다.
- 자식 프로세스의 개수는 d->nb_cmds에 의해 결정되며, 이는 실행할 명령어의 총 개수와 같습니다. 루프가 d->nb_cmds만큼 반복되므로, 최종적으로 d->nb_cmds개의 자식 프로세스가 생성됩니다.
parent(d) 함수는 자식 프로세스의 종료를 관리하는 역할을 수행하지만, 자식 프로세스를 직접 종료하는 함수는 아닙니다. 대신, parent(d) 함수는 부모 프로세스가 자식 프로세스의 종료를 기다리고, 자식 프로세스의 종료 상태를 처리하는 기능을 수행합니다.
parent(d) 함수의 역할
- 자식 프로세스의 종료 대기:
- 일반적으로 부모 프로세스는 wait() 또는 waitpid() 함수를 사용하여 자식 프로세스가 종료될 때까지 대기합니다. 이 함수는 자식 프로세스가 종료될 때까지 블록(block) 상태로 대기하며, 종료된 자식 프로세스의 PID와 종료 상태를 반환합니다.
- 종료 상태 처리:
- 자식 프로세스가 종료되면, 부모 프로세스는 자식 프로세스의 종료 상태를 확인할 수 있습니다. 이를 통해 자식 프로세스가 정상적으로 종료되었는지, 아니면 오류가 발생했는지를 판단할 수 있습니다.
- 종료 상태를 확인한 후, 부모 프로세스는 필요한 후속 작업을 수행할 수 있습니다. 예를 들어, 자식 프로세스의 종료 코드를 기록하거나, 특정 작업을 수행할 수 있습니다.
- 자원 정리:
- 부모 프로세스는 자식 프로세스가 종료된 후, 해당 프로세스의 자원을 정리합니다. 이는 시스템 자원의 누수를 방지하는 데 중요합니다.
- parent(d) 함수는 자식 프로세스의 종료를 관리하고, 종료 상태를 확인하며, 필요한 후속 작업을 수행하는 역할을 합니다.
- 자식 프로세스는 fork() 호출로 생성되며, 부모 프로세스는 자식 프로세스를 종료시키지 않습니다. 대신, 자식 프로세스가 스스로 종료되도록 하고, 부모 프로세스는 그 종료를 기다리고 처리합니다.
'C Language' 카테고리의 다른 글
파이프 구조체 설명 (0) | 2025.01.21 |
---|---|
d->cmd_options = ft_split(d->av[d->child + 2 + d->heredoc], ' '); (0) | 2025.01.18 |
pipe 함수 사용법 (0) | 2025.01.18 |
here_doc 모드로 사용자 입력 받기 (0) | 2025.01.18 |
< infile ls -l | wc -l >outfile (0) | 2025.01.18 |