[완료] 대기하고있는 프로그램 만들기

visualplus의 이미지

소켓의 accept()나 select() 같은것들은 어떤 원리로 구현이 되어있는건지 궁금합니다.
가령

int main()
{
   return 0;
}

란 프로그램이 있을 경우 실행하면 그냥 끝나버리는데, 특정 신호가 들어오면 행동을 하도록
계속 끝나지 않도록 하고있게 하려면

int main()
{
   signal(...);
   while (1) {
   }
   return 0;
}

이런식으로 만들었습니다. 그런데 이렇게하면 cpu사용량이 너무 올라가버려서

int main()
{
   signal(...);
   while (1) {
       sleep(1);
   }
   return 0;
}

이런식으로 while문 중간에 1초간 대기하라고 해서 cpu사용량을 낮췄는데..
그런데 이렇게 하면 특정 신호가 왔을 때 1초 뒤에 반응 할 수 도 있겠지요.

그럼.. 소켓에서 accept()나 select()같은 경우는 클라이언트가 접속하면 즉각 반응을 해주고,
cpu사용률도 높지않던데.. 이런건 어떻게 구현을 하는지 궁금합니다.

소스를 보고 이해하면 좋겠지만.. 제가 그럴 실력이 아니라.. 이런게 어떤 원리로 돌아가는지만이라도
알고싶은데..

혹시 이런 류의 프로그래밍 기법들이 있는건지요?

bookgekgom의 이미지

소켓의 구현 원리는 파일을 읽고 쓰는것과 똑같습니다.

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

visualplus의 이미지

음.. 그럼 대기하고 있는건 어떻게 만드는것인가요?
select 가 파일을 읽는것이라고 치면,

만약 파일에 아무 내용이 없으면 대기하다가 파일에 
어떤 값이 입력되면 그 값을 읽어서 리턴

이렇게 동작을 할텐데..
저는 어떻게 아무런 동작없이 종료되지 않을수있는지 궁금합니다.

cinsk의 이미지

user space라면, pause(), sched_yield(), wait(), waitpid()등을 찾아보세요.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

visualplus의 이미지

이런것들이 있었군요..
감사합니다!!

jos77의 이미지

보통 signal 을 이용해서 내부 시스템 함수로 구현되어있는 걸로 압니다...
pause() 나 sched_yield() 라면 멀티쓰레드에서 사용하는 함수고 wait / waitpid 는 자식 프로세스 reap 함수니 약간 다를 것 같고요
pause / sched_yield 도 실은 내부적으로 signal 쓰는 걸로 알고 있습니다.
윈도우 프로그래밍할 때에는 Message 내부 api 를 많이 썼었는데
리눅스에서는 마땅한게 없어서 select 나 poll , mutex 등을 잘 사용하는게 맞을 듯 합니다

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

댓글 달기

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