pipe를 이용한 ipc관련 질의입니다.

seongwon1의 이미지

안녕하세요?

pipe를 통해서 ipc를 하는데 잘 되지 않아 이렇게 질문을 드립니다.

일단 코드를 간단히 설명 드리면요.

pipe(file_pipe).....

pipe(file_pipe1)......

이런식으로 파이프를 2개 만들었구요.

fork를 해서 자식프로세서를 총 3개 만들었습니다.

for(i = 0 ; i < 3; i++) {
      pid[i] = fork();
}

이런식으로요.

그리고 나서 하나의 자식 프로세서 예를 들어 pid[0]이라는 프로세스에서

2개의 함수를 호출합니다.

if(pid[0]){
     a();
     b();
}

이런식으로요. 함수 a 에서는 부모에서 write한 파일 디스크립터 file_pipe의

내용을 읽어보면 정상적으로 읽어 오거든요.

그런데 함수 b에서는 엉뚱한 값이 읽혀 집니다. 다른 프로세스에서 내용을

바꾸지 않았나 의심할 수도 있겠습니다만 세마포어를 통해 동시에 파일

디스크립터에 접근하지 못하게 해놨거든요.

제 생각에는 제가 pipe를 잘못 사용하고 있는 것 같은데요.

close와 dup을 어느 때 사용해야 하는지 영 헷갈리네요.

고수님들의 도움 부탁드립니다.

좋은 하루 보내세요.

moonzoo의 이미지

a() 에서는 되는데 b()에서는 안된다면 분명 잘못 설계하신 부분이 있을텐데

위의 글만 가지고는 알수 없겠네요.

직접 적인 원인이라고는 생각치 않지만

for(i = 0 ; i < 3; i++) { 
      pid[i] = fork(); 
} 

위의 fork()할때마다 pid[i]값을 즉시 체크해 주신건가요?

혹시 for 루프 밖에서 pid[i]값을 체크하셨다면.

자식 프로세스 3개가 아니라..

자식의 자식이 꼬리를 물고..여러개가 생길수도 있겠네요.

seongwon1의 이미지

^^ 답변해 주셔서 감사합니다.

일단 프로세스 아이디를 for문 밖에서 체크하긴 하는데요.

ps -af로 체크해 보면..프로세스가 마구 늘지는 않는 답니다...^^;

gdb에서 확인을 해보면

처음에 값을 100으로 초기화 했을 경우...

a()함수에서는 제대로 100으로 파일 디스크립터로부터 읽어 오는데요.

b()함수에서는 000으로 읽혀져 오네요.

물론 다른 프로세스 pid[1], pid[2]에서도 같은 함수 a(), b()를 실행시키지만

세마포어를 이용하기 때문에 동시에 여러개의 a() 또는 b()가 실행되지는 못하거든요.

그 순간에는 어떤 프로세서에 있는 하나의 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.