fork()으로 만든 프로세스에서 주소값은 같은데 value값이 다른이유



지인이 갑자기 궁금한 것이 생겼다고 코알못인 필자에게 물어왔다.
원래 할 것이 있었지만 정말 하기가 싫었으므로 잠깐 보기로 하였다. 지인이 준 코드는 아래와 같다.


#include

#include #include int main() { int * heapint = malloc(sizeof(int)); int num = 1; int * nump = # *heapint = 10; pid_t pit = fork(); if(pit == 0) { *heapint = 128; printf("c_heapint value : %x\n", heapint); printf("c_*heapint value : %d\n", *heapint); } else { sleep(1); printf("p_heapint value : %x\n", heapint); printf("p_*heapint value : %d\n", *heapint); } free(heapint); return 0; }


결과값


** 30번줄은 생략 

지인이 궁금한 점은 주소값이 같은데 왜 value같은 다른지에 대해 의문을 가졌고 다양한 시도를 해보았다.
첫번째로 한번 쓰여진 value값이 다음번에 다시 써져서 출력된 걸로 추측하고 반복문을 통하여 결과값을 확인해보았지만
value값이 일관되게 나오는 것을 확인하고 이 시도는 틀렸다고 판단하였다.
두번째로 fork()에서 추측을 해보았다.
fork()는 부모프로세스를 그대로 복사하여 만드는 프로세스 생성방법이고, 생성당시 Code(Text)영역을 제외한
나머지 영역(Heap,Stack,Data)은 그대로 가져온다. 따라서 자식 프로세스는 부모 프로세스에서 가르키는 주소값을 그대로 가져올 것이다. 프로세스마다 가상의 주소를 가지는데 부모 프로세스와 자식 프로세스 각각의 가상의 주소에서 가르키는 주소값이기때문에 같은 주소값이지만 다른 value값을 가질 수 있다고 판단하였다. 
흐름을 나열하자면 fork()가 선언되고 부모프로세스는 else문에 들어가 주소가 가르키는 value값인 "10"을 출력하고 종료하게되고 자식프로세스는 if문에 들어가(자식프로세스는 pit를 항상 0을 반환한다) 똑같은 주소(다른 가상의 메모리)의 value 값이 "128"바뀌어 출력하게 된다.


참고 

https://kldp.org/node/117746
http://www.joinc.co.kr/w/Site/system_programing/process/Process_Relation

 
P.S 저장을 생활화합시다. 짧은 거 쓴다고 저장안했는데 다쓰는 순간 날라감


  1. Favicon of https://prestige-os.tistory.com BlogIcon Prestige' 2019.04.04 20:50 신고

    궁금했던 내용인데 정말 도움이 되었습니다 ! ㅎㅎ

+ Recent posts