FIFO를 읽을때 무한루프 안돌리고 블럭시킬수 없나요?

마왕의 이미지

숙제를 하고 있습니다.
C-S 아키텍쳐를 간소하게나마 흉내내보자는 것이 주제인데요.

서버는 well-kwown FIFO를 만들어놓고 FIFO에 입력이 들어오길 기다립니다.
클라이언트가 well-known FIFO에 request를 보내면
서버는 포크를해서,
자식놈은 이미 클라이언트가 만들어 둔 client-specific FIFO에 응답을 보내고
어미는 계속 입력을 기다립니다.
물론 서버와 클라이언트는 로컬머신 상에 있습니다.

정말 간단한 구조입니다.
그래서 이미 다 짰습니다.

그런데 문제가 뭐냐....
서버에서 무한루프를 돌면서 CPU를 100%잡아먹는다는 것입니다.
이렇게 말이죠.


well-known_fd = open(well-known_FIFO, O_NONBLOCK);

...

while(1)
{
    read(well-known_fd, buf, bufsize);
    ...
    fork();
    ...
}

뭐.. CPU가 100%나온다고 해서 낙제점을 받는다거나 하는 것은 아니지만
뭔가 찝찝합니다.

제가 원다는 것을 다시 말씀드리면,
while loop속에서 read를 만나면,
well-known FIFO에 입력이 들어올때까지 server process가 block되는 것입니다.

고수님들의 답변을 부탁드립니다.

vacancy의 이미지

몬지 정확하게는 모르겠지만 ..
cpu 100% 피하는 건 대개,
sleep 넣어주면 되지 않나요 ?..

초코리의 이미지

select쓰면 되지않을까요?

alsong의 이미지

Quote:
그런데 문제가 뭐냐....
서버에서 무한루프를 돌면서 CPU를 100%잡아먹어야 한다는 것입니다.
이렇게 말이죠.

나와야 된다는건지

Quote:
뭐.. CPU가 100%나온다고 해서 낙제점을 받는다거나 하는 것은 아니지만
뭔가 찝찝합니다.

나오지말아야 된다는건지 ㅎㅎ :)

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

alsong의 이미지

FIFO를 읽을때 무한루프 안돌리고 블럭시킬수 없나요?
목적이 100%를 없애려한다면 Blocking 모드로 오픈하시면 될텐데요 ㅎㅎ.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

pynoos의 이미지

시스템콜(read, write) 등의 모든 에러처리를 하고 계신가요? perror 등을 통해 에러를 확인해보시기 바랍니다.

마왕의 이미지

open할때 block모드로 열면 맨 첨에 첫번째 request받을때 까지는
block되어 있습니다만
첫번째 request를 받고 나서는 다시 loop를 돌면서 CPU 100%가 되더군요

select를 쓰시라는 말씀에 select man page를 잠깐 봤는데요..
확실히 select를 쓰면 될것같습니다만,
select를 쓰지않고 해결할 수 있는 방법이 없을까요.

제가 뭘 모르긴 모르고 있는거 같은데....

해랑사. 해랑사. 잊을 수 있는 얘길 해줘..

pynoos의 이미지

pipe가 close되어있는데 close된지 모르고 계속 돌아가고 있는것 같습니다.

마왕의 이미지

pynoos wrote:
시스템콜(read, write) 등의 모든 에러처리를 하고 계신가요? perror 등을 통해 에러를 확인해보시기 바랍니다.

무한루프를 돌면서 read()를 하면서 클라이언트의 요청을 대기할때의
errno값은 0이고
perror는 illegal seek이라는 메시지를 내뱉습니다.
그때의 read()의 리턴값은 0이구요.

아무래도 좀 더 공부해야될것같습니다.

답글달아주신분들 고맙습니다. :roll:

해랑사. 해랑사. 잊을 수 있는 얘길 해줘..

pynoos의 이미지

read의 return 값이 0 이면 이미 종료된 것입니다.
함수 에러처리는 모두 된 다음 디버깅하는 것이 좋은 습관이지요.

댓글 달기

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