int main(){
pid_t pid;
//fork a child process
pid = fork();
if (pid < 0 ) { //에러 발생시 실행되는 부분
return 1;
}
else if ( pid == 0){ //child process가 실행되는 부분
printf("child process, pid = %d\n");
execlp( 생략 );
}
else { //parent process가 실행되는 부분
printf("parent process, pid = %d\n",pid);
wait(NULL); //parent는 child가 종료될때까지 기다린다.
}
return 0;
}
컴파일되면 어떻게 그런 결과가 나오는지 궁금했는데,
처음 결과를 보기 전에 if또는 else if, else 중에 하나만 나오는 것이라고 생각함
그런데 else if의 child process와 else의 parent process 부분이 둘 다 출력된 것.
문법상으로 도저히 이해가 안됐음. if나 else if, else중에 하나만 실행되야 하는거 아닌가?
그런데.. 생각해보니 프로세스를 생성할 때, 상태와 전역변수, text가 같이 복사되어 child가 생성된다.
즉, pid = fork(); 여기까지 실행되었다는 상태가 저장되고, 전역변수(만약 있다면)의 현재값이 저장되고, 코드가 같이 저장되는 것.
따라서 pid = fork();로 child가 생성되고나서는 프로세스가 두개가 된다.
parent프로세스와 child 프로세스
그리고 각각 실행된다. parent프로세스도 child프로세스도 pid = fork(); 이후부터 각각 실행! (왜냐면 여기까지 실행했다는 상태가 저장되었기 때문에, 이전의 코드는 실행되었다고 보는 것.)
좀더 직관적으로 생각하려면, pid=fork();전까진는 하나의 프로세스만 실행되다가, pid = fork();를 만나게 된다면 위에서 작성한 코드가 2세트가 있다고 생각하기. 그래서 한쪽에서는 parent 프로세스가 pid = fork();이후부터 실행되는 것이고 다른 한쪽에서는 child프로세스가 pid = fork();이후부터 실행되는 것 같다.
따라서, parent 프로세스는 if, else if, else의 조건을 다 훑어보고난뒤에 else에 해당하므로 else 부분이 실행되는 것이고,
child프로세스도 if, else if의 조건을 훑어본뒤에 else if에 해당하므로 else if 부분이 실행되는 것.
이렇게 5번 라인처럼 pid = fork();를 만나게 된다면
하나였던 프로세스에서 child 프로세스가 생겨난다.
즉, 다음과 같이
좌측은 parent 프로세스, 우측은 child 프로세스로 두개의 프로세스가 실행된다고 생각하면 된다.
그리고 각각의 프로세스는 각각 실행된다.
검색해보니까 컴파일 창이 하나여서 동시에 섞여서 마치 하나처럼 실행되는 것같이 보인다고 하는 글을 본적이 있다.
하지만 그것을 창을 분리해서 실행해볼수도 있다고 하는 내용이 있었는데 해보지는 않았지만, 그렇게도 확인해볼수 있을것 같다.