[몹시 궁금함] fork()시에 메모리를 어떻게 하는지요?

익명 사용자의 이미지

main()
{
x = malloc(....);
func(x);
free(x); <<--- 여기가 문제입니다..
}

func(x)
{
pid = fork();

if(pid == 0)
{
exec...(x,....); //차일드 루틴 수행;
}
}

다시 메인으로 돌아와서 메모리를 해제하려고 하니. 메모리 주소가 틀려
져 있더군요. 아마도 부모가 한번 메모리를 선언하고, 자식이 역시 또 한
번 메모리를 선언하기 때문이겠죠?

그런데 메모리는 선언한 곳에서 해제하는것이 원칙일텐데..

이런 경우는 메모리 주소가 누군가 바꾸어서, 어떻게 해제해야합니까?

이 자식이 메모리 또 선언하고 주소 바꾸고, exec성공적으로 수행하고..
나 몰라라 도망가서 메모리를 해제할 길이 읍네여..

못된자식이네여..-_-

꼴통같은 자식.. 부모 모르게 딴짓하고 도망이나 가고..

익명 사용자의 이미지

무슨 애기인지 잘은 이해가 안가지만 메모리 주소가 틀려진게
당연한듯 싶은데요.일단 앞에 애기하신대로 부모와 자식이 서로다른
메모리 공간을 선언했고 또 그 공간은 공유하지 않기때문에 주소가 다르게
나올거 같은데요.fork쓰시지 마시고 clone를 써보시죠.clone함수로는
부모와 자식간의 공간을 서로 공유할수 있습니다.

익명 사용자의 이미지

아무 문제없습니다.
문제가 있다면 다른 곳의 문제겠죠.
에러가 어떻게 나는지 다시 말씀해 보세요.

ㅋㅋㅋ
main()에서
x = malloc(); 한 후
printf("%u\n", x);
func(x);
printf("%u\n", x);
free(x);
이렇게 해서 주소를 비교해 보세요.
func() 이후 주소가 바뀌나요?
바뀐다면 func(x) 함수의 문제죠...

익명 사용자의 이미지

문제가 되게 만들었네요.

하상근 wrote..
main()
{
x = malloc(....);
func(x);
free(x); <<--- 여기가 문제입니다..
}

func(x) 이순간 x라는 변수는 또다른 지역변수 영역을 할당받게 되죠.
즉 main함수의 malloc 선언한 x와는 이름만 같고 다른 변수란 뜻입니다.
이걸 해결하기 위해서(Call by reference) 포인터가 존재하지요.
{
pid = fork();

if(pid == 0)
{
exec...(x,....); //차일드 루틴 수행;
}
}

이런거는 swap예제에서 많이 나오는데...
기초가 안돼있군요.
c기본 공부부터 다시하시고 posix공부하심이...

익명 사용자의 이미지

뭘까... ㅋㅋㅋ

익명 사용자의 이미지

별달리 문제 될게 없을 것 같은데요..
위에서 x는 포인터가 아닌가요?
다만, func()에서 x에 다른 값을 집어 넣을 경우
문제가 생길 수 있겠지요.
func()를 호출하기 전에, x값을 다른 변수에 복사해서
사용해 보시기 바랍니다.

익명 사용자의 이미지

님께서 올려주신 코드상으로는 문제 될것이 없을듯 하네요

포크하기전에, 이미 malloc을 하셨으니,
이 할당된 메모리는 차이드에도 유효합니다,

부모도 free해주고 child도 free해주어야 겠죠..

뭐... 차일드가 잠깐 실행하고 종료하는 것이라면,
프로세스가 정리될때 자동 정리 될테니 안해주어도 되겠지만요;;

그리고 작성하신 글 중에 메모리 주소가 바뀐다고 했는데,
이상하군요? 안바껴야 정상입니다.

가상메모리를 사용하기 때문에, 물리적인
메모리 주소는 부모와 자식이 다를수 있지만,

포크 직후의 자식과 부모의 가상메모리 내용은 동일합니다.
부모의 메모리를 그대로 복사하기 때문이죠.. 아 틀린게
하나 있군요 fork후에 리턴하는 pid값...

이런 이유로, 대량의 포크가 발생하면
커널이 메모리 복사하느라 바쁘기 때문에,
커널에선 COPY-ON-WRITE 알고리즘을 사용하지요;
먼고 하니, 일딴 부모의 메모리 주소를 참조하고 있다가
실제로 메모리 변경이 일어날때 그넘들을 복사하는 것이죠

Intel 80386 Protected Mode (한글)
http//www.ezdoum.com/stories.php?story=02/05/10/5990080

Overview of P6 address translation
(가상주소를 실제 메모리의 주소로 맵핑하는 과정)
http//www.ezdoum.com/stories.php?story=02/05/06/3601258

익명 사용자의 이미지

포인터의 주소를 넘겨주지 않는 한은 저 포인터값이
func()실행 뒤에도 바뀔리는 없지 않나요?

님이야말루 기본부터 다시 하셔야겠네 ㅡ.ㅡa

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.