[질문] IPC 통신중 프로세스 대기 시키는 방법에 대해 질문입니다..

zippiest의 이미지

IPC 통신중 FIFO 로 정보를 주고 받는 프로그래밍을 하고 있습니다...

FIFO 에서 두개의 파이프를 통해 통신합니다.. 예를들어 A와 B 프로세스가 있으면

(이때, 총 10개의 데이터를 보낸다고 가정합니다..)

1. A 가 첫번째 파이프를 통해 첫번째의 데이터 1개를 보냅니다.

2. B 가 데이터를 받고 그 데이터를 받고 데이터가 옳은것인지 아닌지를 여부정보를 A에게 두번째 파이프를 통해 보냅니다

3. A는 두번째 파이프를 통해 옳은지 여부정보를 받고 옳다면 다시 첫번째 파이프로 2번째데이터를 보냅니다..

위와같은 방식의 프로그래밍을 하려하는데 B 프로세스를 백그라운드로 띄우고 A를 실행하면,

10개의 데이터가 모두 한꺼번에 보내지게 됩니다.. 즉 A 프로세스가 다 수행되고 나서 B 프로세스가 수행됩니다..

이것을 위에가정한것 처럼 두 프로세스를 번갈아가면서 수행할 수 있는 방법은 없나요???

mach의 이미지

동기화를 이루는 많은 메커니즘이 있지만, 질문자님같은 경우에는 단순하게, Stop and Wait전략으로 풀면 될듯합니다.

A가 D1(데이터 1개)을 B에게 보내고, A는 D1에 대한 응답이 B로 부터 오기 까지 대기(더이상 전송하지 않고)하게 하면 됩니다.
이때, B는 데이터를 1개(D1) 수신하고, 이에 대한 판단후, D1이 옳은 것인지? 틀린 것인지? 둘 다에 대해, 그 여부를 A에게 전송하게 합니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

zippiest의 이미지

네 답변 감사합니다... 그런데 A에대한 응답이 B로부터 오기까지 대기하게 하면서 A에서 바로응답이오면

다시 대기를 푸는 방법을 써야한다는건 아는데..그걸 어떻게 프로그램으로 구현할지를..잘 모르겠습니다..

어떤 한프로세스가 수행되고 있는상태에서..어떻게 대기시켜놓고..다른 프로세스를 실행시키는지...

만약 부모자식간의 프로세스라면 모르는데..서로다른 프로세스간의 어떻게 그렇게 할수 있는지..모르겠습니다..

mach의 이미지

이 경우에 구지 세마포같은 메카니즘이 필요하지 않으며, 단순하게 시스템호출(커널을 경유)로 그 동기를 맞출수 있겠습니다.

A프로세스의 pseudo code를 기술하자면,

for ( 메시지의 개수) {
write(FIFO); // B에게 쓰는 부분
read(FIFO); // A에게 응답을 받는 부분 -> 이 부분에서 응답이 올때까지 read를 합니다.
// 응답메시지의 길이가 n이라면 nread(), readn()등 루프스타일로 입력받는 루틴을 만들
}

* B프로세스는 반대로 동작하겠지요. read->write형태로 말입니다.
* readn() 워낙에 자주 사용되는 코드이다 보니, 표준처럼되어버린 함수입니다. 검색하면 쉽게 찾으리라고 봅니다.


------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

vamf12의 이미지

파이프 같은 경우에 굳이 비동기로 파이프를 열지 않으면 기본적으로 동기 전송 아닌가요?

읽기든 쓰기든, 상대방 쪽에서 반응이 없을 경우 블록되어서 대기 상태로 들어 가지 않나요?

mach님께서 말씀하신대로 읽기 쓰기를 번갈아서 하면, 읽는 프로세서가 항상 블록되어서 별다른 동기화 메커니즘 필요 없으듯 합니다.

댓글 달기

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