> For the complete documentation index, see [llms.txt](https://toothlessdev.gitbook.io/main/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://toothlessdev.gitbook.io/main/computer-science/network-programming/ch10.md).

# Ch10 멀티 프로세스 소켓통신

## 📖 프로세스

### ✏️ 프로세스

프로세스는 실행중인 프로그램의 인스턴스로, 실행 중인 프로그램에 관련된 메모리와 리소스를 총칭하는 의미로 사용됩니다.

운영체제는 생성되는 모든 프로세스에 PID (Process ID) 를 할당하고,\
프로세스는 Text / Data / Heap / Stack 영역으로 구성되어 있습니다.

### ✏️ 프로세스의 생성

`fork()` 를 사용하면 현재 실행중인 프로세스의 복사본을 생성 할 수 있습니다\
해당 프로세스의 복사본은 메모리 영역까지 동일하게 복사합니다\
따라서, 부모 자식 프로세스의 전역변수, 지역변수는 모두 각각 다른 영역에 할당되고, 다른 값을 갖게 됩니다

```c
#include <unistd.h>
pid_t fork(void);
// 성공시 새로운 PID 를 리턴
// 실패시 -1 리턴
```

메모리의 코드 (Text) 영역까지 동일하게 복사하기 때문에, `fork()` 가 리턴하는 값을 사용하여\
자식 프로세스와 부모 프로세스를 구분할 수 있습니다

```c
#include<stdio.h>
#include<unistd.h>

int main() {
    pid_t pid;
    
    if(pid == 0) {
        // Child Process
    }
    else {
        // Parent Process
        // 이때 pid 의 값은 자식 프로세스의 pid 값을 갖습니다
    }
}
```

### ✏️ 좀비 프로세스

실행이 완료 되었음에도 소멸되지 않는 프로세스를 좀비 프로세스라고 합니다\
`main()` 함수가 종료 반환 되면 프로세스가 소멸되어야 합니다.

자식 프로세스는 다음과 같은 경우에 종료됩니다

> 1. 인자를 전달하면서 exit 을 호출하는 경우 (예 - `exit(1)` `exit(-1))`
> 2. main 함수에서 return 문을 실행하며 값을 반환하는 경우 (예 - `return 0, return -1`)&#x20;

이때,\
자식 프로세스가 종료되면서 반환하는 값이 부모 프로세스에게 전달되지 않으면\
자식 프로세스는 좀비 프로세스가 되고,\
부모 프로세스가 종료되어야 자식 좀비 프로세스도 종료하게 됩니다

### ✏️ wait() 을 사용한 좀비 프로세스의 소멸&#x20;

`wait()` 는 자식 프로세스가 종료될 때 까지 대기 (blocking) 하고, 자식 프로세스가 종료한 상태를 가져오는 함수 입니다.

```c
#include<sys/wait.h>
pid wait(int *status);
// 성공 : 종료된 자식 프로세스의 id 반환
// 실패 : -1 반환
```

이후, 전달받은 status 로 자식 프로세스의 종료 상태를 분석할 수 있습니다

```c
int WIFEXITED(int status);
// 자식 프로세스의 정상 종료 여부 확인 (wait if exited)
// 정상 종료시 Non-Zero 반환

int WEXITSTATUS(int status);

```
