NMS를 만들다가 fork()되는 부분에서 메모리에 관한 질문입니다.

sun1226의 이미지

전체소스를 보여드리긴 너무 길구요....
막히는 부분을 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()되고 있는
상황에서는 안되는지.....

shkwon81의 이미지

자식 프로세스와 부모 프로세스의 메모리는 (적어도 논리적으로는) 완전히 분리된 공간입니다.

    if((pid=fork())==0){ 
        
            ping(); 
            sleep(20); 
        
    } 

    if((pid=fork())==0){ 
        sleep(2); //ping()에서 linked list를 만드는데 걸리는시간.. 
        fork_test(); 
    }

첫 번째 fork() 호출이 리턴할 때, 자식 프로세스는 ping()을 호출하고 20초간 잠들지만, 부모 프로세스는 바로 아래의 fork() 호출로 넘어옵니다. 그렇다면 sleep(2)의

// linked list를 만드는데 걸리는 시간

이라는 주석은 어떤 의미인지요? 부모 프로세스에서 자식 프로세스가 linked list를 다 만들기를 기다린다는 의미인지요? 그렇다면, 일반적인 fork() 호출에서는 자식 프로세스가 linked list를 만든 것은 부모 프로세스와는 전혀 별개의 메모리 공간에서 이루어집니다.

따라서, 위의 코드에서는 두 번째 fork()를 거친 후에, 자식 프로세스의 자식 프로세스에서는 초기화된 linked list를 이용하실 수 있을 것입니다.

jemiro의 이미지

쓰레드와 프로세스를 혼동하셨나보군요.
그리고 sleep 으로 하는것이 아니라 mutex로 lock을해야 할듯 합니다.

sun1226 wrote:
전체소스를 보여드리긴 너무 길구요....
막히는 부분을 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);
    }

}

이소스는 test용으로 만든 것입니다..
문제는 첫번째 fork()에서 ping()함수에서는 linked list를 초기화하고
관련정보를 insert합니다....
여기서 만든 linked list를 두번째 fork()의 fork_test()에서 사용을 할려고
합니다....그런데 ping()다음에 sleep(20)이 있는데
sleep하고 있는 동안에는 fork_test()에서 linked list정보를 사용을 못하더라구요.... sleep()을 빼고 하면 정상적으로 출력이 되는데요...

sleep()이 process에 미치는 영향을 모르겠어요...왜 sleep()되고 있는
상황에서는 안되는지.....

sun1226의 이미지

thread는 확실히 아니구요....프로젝트의 전체적인 설계는 process로 하라고
해서...thread는 사용안했습니다....

그리고 윗분께서...sleep(2)의 의미는 ping()이 다 완료될때까지를
기다린다고 보면 되겠습니다.....

그리고 별개의 것은 아닌것같습니다...sleep(20)을 빼면 정상적으로 돌아가거든요.....

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.