printf 문이 이상한 건지 sleep이 이상한 건지...

dalant019의 이미지

#include
#include

int main()
{
while(1)
{
printf("hello world");
sleep(1);
}
}

위의 프로그램을 데비안에서 실행하니 멈추네요. ^^

#include
#include

int main()
{
while(1)
{
printf("hello world\n"); //개행 문자 추가
sleep(1);
}
}

이렇게 바꾸니깐 동작합니다.

음... 이걸 어떻게 해석해야 할까요?
1. printf문의 실행으로 응용은 멈추고 화면에 출력하기 위해 커널 모드로 진입
2. 커널은 출력장치에 "hello world"를 출력해달라고 요청 한뒤 다음 프로세스를 스케줄링
3. 스케줄링 할 응용이 없음으로(아직 이 응용은 printf 문을 완료하지 못 했음) 아이들 프로세스를 실행
4. 화면 출력이 끝났다는 인터럽트 도착 후 이 응용이 실행 상태가 되어 스케줄링 됨
5. 이 응용의 sleep함수가 호출됨

제 머리로는 위와 같은 시나리오만 생각이 되네요...
4번이 문제인 것 같은데... printf가 버퍼링을 하고 있다는 이야기가 되는데... 아~ 모르겠다~ 고수님들 도와주세요~~~

피에스 : 이 이유를 찾는데 거의 2시간 허비했습니다~ 이론 삽질 싫어~~~

dalant019의 이미지

맞는지는 확실히 모르겠지만
버퍼링이 때문인 것 같습니다. 1024의 버퍼를 가지고 있는 것 같네요~
음... 버퍼링만 한 뒤 printf 문을 종료하는 것 같네요. 왜 그러거지~ 성능(속도) 상의 이유인 것 같은데요~

잘못하면 디버그 할 때 출력문을 남발하다 보면 웬지 꼬일 수 있을 것 같네요~

아직 미심쩍어요~ 고수님들이 맞는지 확실히 짚어 주시면 감사하겠습니다.~~~

ssehoony의 이미지

짐작하신대로

사실 두 소스 코드 모두 작동을 잘 하고 있습니다.
다만 처음 코드는 printf 가 화면에 출력을 하지 않고
계속 버퍼에 쌓아 두고만 있기 때문에 화면에 출력되는 결과가
없을뿐 계속 작동하고 있는 것이지요.
아주~ 오래 동작 시켜 놓으면 버퍼가 차서 자동으로
flush 될때 화면에 hello world 를 무쟈게 많이 보실 수 있을거에요.

그런데 printf 의 특징중 하나로
개행문자를 만나면 그 즉시 버퍼의 내용을 화면에 출력합니다.
그렇기 때문애 두번째 코드에서는 hello world 를 바로 바로
볼 수가 있는 것이지요.

처음 코드의 printf 다음에
fflush(stdout); 으로 강제로 버퍼를 비우게 하면
원하시는 결과가 나올 듯 하네요.

이렇게 하는 이유는 퍼포먼스 때문인데요
남발한다고 해도 내용이 꼬이지는 않습니다.

kewlbear의 이미지

printf의 특징이라기 보다는 stdout의 버퍼링이 기본적으로 라인 버퍼링으로 되어 있기 때문입니다. 참고로 setvbuf 함수를 이용해서 버퍼링을 바꿀 수 있습니다.

댓글 달기

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