clone의 agument중 void* stack에 관하여 ...
페도라 5에서 프로젝트를 진행중입니다..
fork()를 사용하여 작업을 진행하였으나 이런저런 이유로 인해 clone을 사용하여야 할것 같습니다.
clone이라는것을 듣기는 많이 들었는데 사용해본적이 없어 좀 생소하네요..
int clone(void *(*fn)(void *arg),void *stack, int flag, void *arg);
stack이라는것이 man page에서 보면 fn에서 사용될 stack이라고 나와있습니다. 크기를 얼마나 줘야 될지 몰라 NULL을 주면 커널이 적당이 알아서 만들어 줄것 같았는데.. clone이 -1을 리턴하는 군요..
그래서 적당한 크기(malloc으로 heap에 만듬)를 만들고 넣어 주니 어느정도 생각되로 프로그램이 돌아갑니다.
1번째궁금증..
stack의 적당한 크기를 얼마나 잡아 줘야 되는냐입니다... fork를 사용할였을때나 pthred_creat를 사용할때는 stack의 크기는 전혀 신경을 안쎳는데.. 조금 낯설군요..
그리고 fn에서 exeve()함수를 불러 자식(clone을 통하여 만들어진 쓰레드)프로세스를 다른 프로그램으로 교체를 할려고 합니다.
2번째궁금증..
그럼 stack이라는 공간은 exeve()를 통해 변경된 프로세스 이미지에도 사용되는냐는 것입니다. 그것이 아니라 새롭게 프로세스 이미지가 교체되면서 stack공간이 생겨난다면 stack이라는 공간은 free시켜줘야 되는것이 아닌지요..(왠지.. 당연히 프로세스 이미지에 맞는 새로운 메모리가 할당될것같습니다.)
3번째궁금증..
커널 2.6부터는 fork가 clone을 호출한다는것을 들어 알고는 있습니다. 커널 소스를 통하여 눈으로 확인하고 싶은데 아직 커널소스를 보는것이 익숙치가 않아서 그부분을 찾지 못하였습니다. 어느 위치에서 볼수 있는지..
clone에대해 책이나 웹페이가 있으면 좀 가르쳐 주세요...
그럼이만.. 아직 beginning이라서 모르는것이많습니다.. 고수님들 조언좀.. ^^a
댓글 달기