프로세스끼리 변수공유..?

sadrove의 이미지

fork()로 자식프로세스가 생성되는데..
생성되고 소멸되는 프로세스들간에 하나의 변수가 공유가 가능한가요.?
예를 들어 아래와 같이요..

int a = 0;

while(조건){
    if((pid = fork()) < 0) error_handling("fork() error!");
    else if(pid==0){
       a += 1;
       exit(0);
    }
}
printf("%d\n", a);

위와같이 부모는 계속 반복해서 자식을 생성하고요...
자식에서 a변수의 값을 1씩 증가하고 싶습니다..
근데 자식 프로세스들이 모두 별도로 생성되니까..
증가가 제대로 안됩니다...
즉, 자식프로세스가 5번 만들어졌다가 소멸됐다면 a 는 5가 되겠죠..
뭔가 좋은 방법이 없을까요..?..^^...
envia의 이미지

fork는 분신술에 가깝습니다. 모든 것이 복사되지요. :D
(pid는 예외로 하고요...)

fork된 뒤부터는 서로 변수가 공유되지 않습니다.

fork 하기 전에 a 변수의 값을 늘려 주시면 되겠네요.

아니면 pipe와 같은 방법을 통해 프로세스간 통신을 해 주셔도 됩니다.

----

It is essential, if man is not to be compelled to have recourse, as a last resort, to rebellion against tyranny and oppression, that human rights should be protected by the rule of law.
[Universal Declaration of Human Rights]

kebie의 이미지

파일을 따로 두어서 그곳에 프로세스 카운트 값을 저장하시면 되지 않을까요?
(파일락을 사용해야 할듯...)

또는 스레드를 사용해도 될 것 같구요. ^^;

yamainu의 이미지

프로세스끼리 통신하라고 만든게 IPC 니까 ...
그녀석들을 사용하세요...
IPC에 관한것은 스티븐슨의 책을 참고하시면 되겠내요...
(위의 답변중 파이프도 IPC의 하나이니까 간단히 파이프를 쓰셔도 되고요..
파이프라면 ...
간단히 ..부모프로세스에서 변수만들고 자식들이 생성되면서 카운트를 증가시키라는 액션을 취하면 되겠내요..)

Programmers never die: They just GOSUB without RETURN.

xfree의 이미지

윗분들 말씀대로 IPC나 thread 사용하세요^^

faye의 이미지

부모와 자식간이라면.. mmap을 사용하셔도 좋을듯 하내요..

Tony의 이미지

파이프보다는 shared memory가 좋을것같은데요?
더 무식한 방법으로는 /tmp에 파일을 하나 만들어두고 쓰는방법이 있습니다. ㅎㅎㅎ

pynoos의 이미지

하지말고 사용하지 말라는 방법중에는 vfork가 있습니다.

요놈은 vfork 후에 exec 계열 함수를 부르는 용도로 주로 사용되는데, 기본적인 개념은 parent로부터 copy가 일어나지 않고 공유하는 특성이 있기 때문에 가능하기는 합니다.

하지만 동작은 보장되어 있지 않으며, 사용하면 안됩니다.

배우시는 입장에서 쓰는 코드라면, 간단한 테스트정도로 하고 마치시는 것이 좋은 코드고 실전에는 사용하지 마시기 바랍니다.

위 코드를 vfork로 바꿔보세요.

댓글 달기

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