NMS를 만들다가 fork()되는 부분에서 메모리에 관한 질문입니다.
글쓴이: sun1226 / 작성시간: 금, 2003/05/16 - 11:23오전
전체소스를 보여드리긴 너무 길구요....
막히는 부분을 test용으로 만들어봤습니다... 일단 함 보시구요....
#include "a.h" //header정보 void fork_test(void); int main(){ int pid; if((pid=fork())==0){ ping(); sleep(20); } if((pid=fork())==0){ sleep(2); //ping()에서 linked list를 만드는데 걸리는시간.. fork_test(); } } void fork_test(){ PING_NODE *t=NULL; t=ping_head->next; for(t;t!=ping_tail;t=t->next){ printf("ip:%s\n",t->ip_addr); } }
a.h에 초기화,head,tail정보가 다 들어있음
이소스는 test용으로 만든 것입니다..
문제는 첫번째 fork()에서 ping()함수에서는 linked list를 초기화하고
관련정보를 insert합니다....
여기서 만든 linked list를 두번째 fork()의 fork_test()에서 사용을 할려고
합니다....그런데 ping()다음에 sleep(20)이 있는데
sleep하고 있는 동안에는 fork_test()에서 linked list정보를 사용을 못하더라구요.... sleep()을 빼고 하면 정상적으로 출력이 되는데요...
sleep()이 process에 미치는 영향을 모르겠어요...왜 sleep()되고 있는
상황에서는 안되는지.....
Forums:
자식 프로세스와 부모 프로세스의 메모리
자식 프로세스와 부모 프로세스의 메모리는 (적어도 논리적으로는) 완전히 분리된 공간입니다.
첫 번째 fork() 호출이 리턴할 때, 자식 프로세스는 ping()을 호출하고 20초간 잠들지만, 부모 프로세스는 바로 아래의 fork() 호출로 넘어옵니다. 그렇다면 sleep(2)의
// linked list를 만드는데 걸리는 시간
이라는 주석은 어떤 의미인지요? 부모 프로세스에서 자식 프로세스가 linked list를 다 만들기를 기다린다는 의미인지요? 그렇다면, 일반적인 fork() 호출에서는 자식 프로세스가 linked list를 만든 것은 부모 프로세스와는 전혀 별개의 메모리 공간에서 이루어집니다.
따라서, 위의 코드에서는 두 번째 fork()를 거친 후에, 자식 프로세스의 자식 프로세스에서는 초기화된 linked list를 이용하실 수 있을 것입니다.
Re: NMS를 만들다가 fork()되는 부분에서 메모리에 관한 질문입?
쓰레드와 프로세스를 혼동하셨나보군요.
그리고 sleep 으로 하는것이 아니라 mutex로 lock을해야 할듯 합니다.
질문한 사람입니다..
thread는 확실히 아니구요....프로젝트의 전체적인 설계는 process로 하라고
해서...thread는 사용안했습니다....
그리고 윗분께서...sleep(2)의 의미는 ping()이 다 완료될때까지를
기다린다고 보면 되겠습니다.....
그리고 별개의 것은 아닌것같습니다...sleep(20)을 빼면 정상적으로 돌아가거든요.....
댓글 달기